一、需求描述
业务理解1:七天内最大连续登陆天数
业务理解2:七天内最近连续登陆天数(最近一天如果未登陆则连续登陆天数为0)
示例说明:
二、数据结构
流量表 tracking
字段名 | 字段中文名 |
---|---|
userid | 用户id |
dt | 分区 |
口径描述:userid不为空则代表登陆
三、SQL
(1)七天内最大连续登陆天数
-- 1、按照userid dt去重
-- 2、rownumber()over(partition by userid order by dt) rn
-- 3、dt - rn
-- 4、count(1) group by dt,new_dt
selectuser_id,sum(login_cnt) as login_cnt -- 近7天登录次数,max(login_cnt) as max_series_login_cnt -- 近7天最大连续登录天数
from
(selectuser_id,new_dt,count(1) as login_cnt -- 连续登录天数from( -- 登录日期 - rnselectuser_id,dt,date_add(dt,-rn) as new_dtfrom( -- 算rnselectuser_id,dt,row_number()over(partition by user_id order by dt) rnfrom( -- 去重selectuser_id,dtfrom <库名>.<表名>where dt between <七天前日期> and <T-1日期>group by user_id,dt) tttt) ttt) ttgroup by user_id,new_dt
) t
group by user_id
(2)七天内最近连续登陆天数
-- 1、rownumber()over(partition by userid order by dt desc) rn
-- 2、当天日期 - dt + 1
-- 3、对比2和1是否相等,如果相等,给该userid dt打连续登陆标签
-- 4、筛选出连续登陆的数据,并取max(rn)
selectuser_id,count(dt) as login_days -- 登录天数,coalesce(max(case when is_continue = 1 then rn end),0) as continus_days -- 连续登陆天数
from
(selectuser_id,dt,if(day_diff=rn-1,1,0) as is_continue,rnfrom( -- rn、昨天和登录日期相差的天数selectuser_id,dt,row_number()over(partition by user_id order by dt desc) as rn,datediff(<T-1日期>,dt) as day_difffrom( -- 去重selectuser_id,dt -- 登录日期from <库名>.<表名>where dt between <七天前日期> and <T-1日期>group by user_id,dt) aaa) aa
) a
group by user_id