题解 | #统计活跃间隔对用户分级结果#
统计活跃间隔对用户分级结果
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