一、需求描述
业务理解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
select
user_id
,sum(login_cnt) as login_cnt -- 近7天登录次数
,max(login_cnt) as max_series_login_cnt -- 近7天最大连续登录天数
from
(
select
user_id
,new_dt
,count(1) as login_cnt -- 连续登录天数
from
( -- 登录日期 - rn
select
user_id,dt,date_add(dt,-rn) as new_dt
from
( -- 算rn
select
user_id,dt,row_number()over(partition by user_id order by dt) rn
from
( -- 去重
select
user_id
,dt
from <库名>.<表名>
where dt between <七天前日期> and <T-1日期>
group by user_id,dt
) tttt
) ttt
) tt
group 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)
select
user_id
,count(dt) as login_days -- 登录天数
,coalesce(max(case when is_continue = 1 then rn end),0) as continus_days -- 连续登陆天数
from
(
select
user_id
,dt
,if(day_diff=rn-1,1,0) as is_continue
,rn
from
( -- rn、昨天和登录日期相差的天数
select
user_id
,dt
,row_number()over(partition by user_id order by dt desc) as rn
,datediff(<T-1日期>,dt) as day_diff
from
( -- 去重
select
user_id
,dt -- 登录日期
from <库名>.<表名>
where dt between <七天前日期> and <T-1日期>
group by user_id,dt
) aaa
) aa
) a
group by user_id