#思路:用每个用户最早、最晚两个活跃时间与划分标准进行判断并分类即可。
with tb1 as(
    select uid, date(in_time) dt from tb_user_log
    union all 
    select uid, date(out_time) dt from tb_user_log)

select user_grade, round(count(user_grade)/max(num),2) ratio
from (
select count(uid)over() num,
case when a<date_sub(c,interval 6 day) and b>=date_sub(c,interval 6 day) then '忠实用户'
when a>=date_sub(c,interval 6 day) then '新晋用户'
when b<date_sub(c,interval 6 day) and b>= date_sub(c,interval 29 day) then '沉睡用户'
else '流失用户' end user_grade
from (
select distinct uid, 
min(dt)over(partition by uid) a,
max(dt)over(partition by uid) b,
date('2021-11-04') c
from tb1) as tb2
) as tb3
group by user_grade
order by ratio desc, user_grade