with a as( select uid,artical_id,date(in_time) as dt from tb_user_log union select uid,artical_id,date(out_time) as dt from tb_user_log), b as ( select uid,min(dt) as first_date, max(dt) as last_date from a group by uid ), cur as( SELECT MAX(dt) AS cur_date FROM a ), user_num as( select count(distinct uid) as cnt from a ) select user_grade, round(count(uid)/cnt,2) as ratio from( select distinct a.uid, case when last_date between date_sub(cur_date,interval 29 day) and date_sub(cur_date,interval 7 day) then '沉睡用户' when last_date <= date_sub(cur_date,interval 29 day) then '流失用户' when (first_date between date_sub(cur_date,interval 6 day) and cur_date) then '新晋用户' when (first_date < date_sub(cur_date,interval 6 day)) and (last_date between date_sub(cur_date,interval 6 day) and cur_date) then '忠实用户' end as user_grade from a join b on a.uid = b.uid cross join cur )d cross join user_num group by user_grade,cnt order by ratio desc
二刷