select user_grade,round(count(1)/(select count(distinct uid) from tb_user_log),2) as ratio
from(
select uid,(case when timestampdiff(day,in_time,cur_dt) < 7 then '新晋用户'
    when timestampdiff(day,in_time,cur_dt) >= 7 and timestampdiff(day,out_time,cur_dt) < 7 then '忠实用户'
    when timestampdiff(day,out_time,cur_dt) >= 7 and timestampdiff(day,out_time,cur_dt) < 30 then '沉睡用户'
    when timestampdiff(day,out_time,cur_dt) >= 30 then '流失用户' end) as user_grade
from(
select uid,min(in_time) as in_time,max(out_time) as out_time from tb_user_log
group by uid) as t1
left join (select max(out_time) as cur_dt from tb_user_log) as t2
on 1) as tt
group by user_grade
order by ratio desc

case whend的用法,提取当前日期cur_dt,最早登陆时间用来判断新晋用户,最晚登陆时间用来判断活跃天数,最后分组聚合求和即可