-- 问题提炼:连续登陆 不少于3天 WITH login_tb2 AS ( SELECT DISTINCT -- 该题忽略单日多次登录情况 user_id ,DATE(log_time) AS log_time FROM login_tb ORDER BY user_id, log_time ), -- user_id|log_time | -- -------+----------+ -- 1003|2022-02-09| -- 1003|2022-02-10| -- 1003|2022-02-11| -- 1101|2022-02-09| -- 1102|2022-02-09| -- 1102|2022-02-11| -- 1102|2022-02-12| login_tb3 AS ( SELECT user_id ,log_time ,ROW_NUMBER()OVER(PARTITION BY user_id ORDER BY log_time) AS r FROM login_tb2 ), -- user_id|log_time |r| -- -------+----------+-+ -- 1003|2022-02-09|1| -- 1003|2022-02-10|2| -- 1003|2022-02-11|3| -- 1101|2022-02-09|1| -- 1102|2022-02-09|1| -- 1102|2022-02-11|2| -- 1102|2022-02-12|3| login_tb4 AS ( -- 日期 减 序号 SELECT user_id ,log_time ,r ,DAY(log_time) - r AS sub FROM login_tb3 GROUP BY user_id, log_time ), -- user_id|log_time |r|sub| -- -------+----------+-+---+ -- 1003|2022-02-09|1| 8| -- 1003|2022-02-10|2| 8| -- 1003|2022-02-11|3| 8| -- 1101|2022-02-09|1| 8| -- 1102|2022-02-09|1| 8| -- 1102|2022-02-11|2| 9| -- 1102|2022-02-12|3| 9| login_tb5 AS ( -- 同时按user_id, sub分组,计算sub列相同的行 SELECT user_id ,sub ,COUNT(sub) AS n FROM login_tb4 GROUP BY user_id, sub ) -- user_id|sub|n| -- -------+---+-+ -- 1003| 8|3| -- 1101| 8|1| -- 1102| 8|1| -- 1102| 9|2| -- 1104| 9|2| -- 1106| 9|3| SELECT user_id FROM login_tb5 WHERE n >= 3 AND user_id IN (SELECT user_id FROM register_tb) ; -- 因为我在DBeaver里修改了题目给的数据实例,所以你能看懂语句就行,语句的输出数据可能和你的不一样。 -- 这样一来,公司让你统计 连续登录不少于一周,半月,类似的问题都能使用这个SQL
一开始我没有思路,看了一些题解,有些题解使用LEAD()函数,但如果让我统计 连续不少于7天的用户,多累啊。
END