-- 逻辑拆解:本质上就是一个连续登录问题,这个问题的核心思维是:按照日期给排名,如果登录日期是连续的,那么日期/天减去排名的值是相等的 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