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 ;
浙公网安备 33010602011771号