SQL连续活跃3天的用户

:active_log

字段:userid(用户ID),active_time(活跃时间)

需求:求连续活跃3天的用户



 

 

 1 -- 第一种方法:
 2 --1. 先以人、日期,row_number 分组排序
 3 --2. 每个日期减序号,得到临时日期,如果连续,那临时日期一样
 4 --3. 以人,临时日期分组,计数>=3 既是需要的
 5 --4. 人去重
 6 select distinct userid from (
 7     select userid,tmp from (
 8         select userid,active_date,num,date_sub(active_date,num) tmp from (
 9             select userid,active_date,row_number over(PARTITION BY userid ORDER BY active_date asc) num from (
10                 select distinct userid,date_format(active_time,'%Y-%m-%d') as active_date from active_log 
11             ) a 
12         ) b 
13 
14     ) c group by  userid,tmp having count(*) >= 3 
15 ) d 
16 ;
17 
18 
19 -- 第二种方法
20 --1. 连续3天,那当前日期往后推2天,就是第三天
21 --2. 当前行日期,往下找2行,找到第三行日期
22 --3. 如果连续,那按日期加2天的日期和往下找2行的日期应该一样
23 -- 注意lead 用法,以及缺失值赋值
24 
25 select distinct userid from (
26         select userid,active_date,date_add(active_date,interval 2 day) datetwo, lead(active_date,2,'9999-01-01') hangtwo from (
27             select distinct userid,date_format(active_time,'%Y-%m-%d') as active_date from active_log 
28         ) a 
29 ) b where datetwo = hangtwo
30 ;

 

posted on 2025-06-21 18:44  北京的小乔  阅读(35)  评论(0)    收藏  举报