数仓面试——连续登录问题

本贴最后更新于 1214 天前,其中的信息可能已经天翻地覆

一、简介

连续登录问题,是一个经典 sql,本文从易到难,简单拓展,有更好方法的同学,欢迎私下交流

二、表结构(去过重的)

CREATE TABLE `user_login`( `id` int COMMENT '用户主键', `dt` string COMMENT '登录日期')

三、表数据

user_login.id user_login.dt 1001 2021-12-12 1002 2021-12-12 1001 2021-12-13 1001 2021-12-14 1001 2021-12-16 1002 2021-12-16 1001 2021-12-19 1002 2021-12-17 1001 2021-12-20

四、需求: 求出连续 3 天登录的用户 id

方法一:自关联

SELECT tmp2.id FROM ( SELECT tmp.id, tmp.dt FROM ( SELECT ul1.id, ul1.dt FROM user_login ul1 INNER JOIN user_login ul2 ON ul1.id = ul2.id WHERE ul2.dt BETWEEN date_sub(ul1.dt, 2) AND ul1.dt ) tmp GROUP BY tmp.id, tmp.dt HAVING count(1) = 3 ) tmp2 group by tmp2.id

详解:

1:因为是固定的 3 天,所以可以采用主键自关联方法,过滤条件为副表 ul2 的登录时间在主表登录时间和主表登录时间减去两天的区间内

2:然后根据主表的 id,和登录时间分组,分组后数量正好是 3 天的,说明连续三天时间都有登录

3:根据步骤二的结果去重,获取结果

更多内容请看:https://blog.stackanswer.com/articles/2022/02/25/1645775761185.html

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
someone
嘿!我是社区系统匿名内容占位账号,大家使用匿名发帖和回帖时将自动使用我作为作者进行填充占位,细节请浏览社区隐私保护系统 https://ld246.com/article/1469346159566