题解 | #统计活跃间隔对用户分级结果#
统计活跃间隔对用户分级结果
https://www.nowcoder.com/practice/6765b4a4f260455bae513a60b6eed0af
with t1 as
(
select uid,
date_format(in_time, '%Y-%m-%d') as in_time,
date_format(max(in_time) over (), '%Y-%m-%d') as today
from tb_user_log
),
t2 as
(
select *,
datediff(today,in_time) as daysub
from t1
),
t3 as
(
select * ,
max(daysub) over (partition by uid) as maxday,
min(daysub) over (partition by uid) as minday,
row_number() over (partition by uid) as rn
from t2
),
t5 as
(
select uid,
maxday,
minday,
case when maxday <= 6 then 1 -- 新晋
when maxday > 6 and minday <= 6 then 2 -- 忠实
when maxday > 6 and minday > 6 and minday <=29 then 3 -- 沉睡
when maxday > 6 and minday >29 then 5 -- 流失
else 0 end as usertype
from t3 where rn = 1
)
select '忠实用户' as user_grade,round(count(if(usertype = 2,1,null)) / count(1),2) as ratio from t5
union
select '新晋用户' as user_grade,round(count(if(usertype = 1,1,null)) / count(1),2) as ratio from t5
union
select '沉睡用户' as user_grade,round(count(if(usertype = 3,1,null)) / count(1),2) as ratio from t5
union
select '流失用户' as user_grade,round(count(if(usertype = 5,1,null)) / count(1),2) as ratio from t5
;