-- 逻辑拆解:本质上就是一个连续登录问题,这个问题的核心思维是:按照日期给排名,如果登录日期是连续的,那么日期/天减去排名的值是相等的
WITH continu_days AS(
SELECT
user_id,
DENSE_RANK() OVER(partition by user_id order by log_time) ranking,
log_time
FROM login_tb
WHERE user_id IN(
SELECT DISTINCT user_id
FROM register_tb
)
),
-- 求出天数与排名之间的差值
time_diff AS(
SELECT user_id,DAY(log_time) - ranking time_gap
FROM continu_days
)
-- 在根据用户、差值去分组,找到次数≥3的
SELECT a.user_id
FROM(
SELECT user_id,COUNT(*) time_cnt
FROM time_diff
GROUP BY user_id,time_gap
) a
WHERE time_cnt >= 3