#新晋 with xinjin as( select uid,min(date(in_time)) as first_date from tb_user_log group by uid having first_date>=date_sub( (select max(date(in_time)) as today from tb_user_log),interval 6 day) and first_date<=(select max(date(in_time)) as today from tb_user_log)), #忠实 zhongshi as( select distinct t.uid from tb_user_log t where date(t.in_time)>=date_sub( (select max(date(in_time)) as today from tb_user_log),interval 6 day) and date(t.in_time)<=(select max(date(in_time)) as today from tb_user_log) and t.uid not in(select uid from xinjin)), #流失 liushi as( select uid from tb_user_log where date(in_time)<date_sub( (select max(date(in_time)) as today from tb_user_log),interval 29 day) and uid not in(select uid from zhongshi) and uid not in(select uid from xinjin)), #沉睡 chenshui as( select uid from tb_user_log where date(in_time)<date_sub( (select max(date(in_time)) as today from tb_user_log),interval 6 day) and uid not in(select uid from zhongshi) and uid not in(select uid from xinjin) and uid not in(select uid from liushi)) #计算 select user_type, round(count(distinct a.uid)/total_users,2) ratio from( select t.uid, case when xj.uid is not null then '新晋用户' when zs.uid is not null then '忠实用户' when ls.uid is not null then '流失用户' when cs.uid is not null then '沉睡用户' else '其他' end as user_type from ( select distinct uid -- 关键去重:确保每个用户只计算一次 from tb_user_log ) t left join xinjin xj on t.uid = xj.uid left join zhongshi zs on t.uid = zs.uid left join liushi ls on t.uid = ls.uid left join chenshui cs on t.uid = cs.uid)a cross join ( select count(distinct uid) as total_users -- 计算总用户数 from tb_user_log) b group by user_type, total_users order by ratio desc
超绝复杂方法