题解 | #统计活跃间隔对用户分级结果#
统计活跃间隔对用户分级结果
https://www.nowcoder.com/practice/6765b4a4f260455bae513a60b6eed0af
select c,round(count(uid)/max(num),2) ratio
from(
SELECT uid,
CASE
WHEN MIN(DATE(in_time))<=date_sub(m.m_day,interval 7 day) and MAX(DATE(in_time)) >= date_sub(m.m_day,interval 6 day) THEN "忠实用户"
WHEN MIN(DATE(in_time))>=date_sub(m.m_day,interval 6 day) THEN "新晋用户"
WHEN max(DATE(in_time))<=date_sub(m.m_day,interval 30 day) THEN "流失用户"
ELSE "沉睡用户"
END c
FROM tb_user_log
CROSS JOIN (
SELECT MAX(DATE(out_time)) m_day FROM tb_user_log
) m
GROUP BY uid,m.m_day
) l
cross join (select count(distinct uid) num from tb_user_log) cnt
group by c
order by ratio desc
(1)找到最大日期,之后与原表做笛卡尔积(JOIN或者CORSS JOIN)
(2)按照uid进行分组,通过每组的最大值和最小值判断用户类型
(3)之后按照用户类型进行分组求和即可,除以总人数得到ratio
