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

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

一、简介

连续登录问题,是一个经典 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