WITH t1 AS(
SELECT DISTINCT uid,
MAX(DATE(in_time)) OVER(PARTITION BY uid) AS act,
MAX(DATE(in_time)) OVER() AS to_day,
MIN(DATE(in_time)) OVER (PARTITION BY uid) AS log_time
from tb_user_log)
,t2 AS(
SELECT uid,
CASE
WHEN DATEDIFF(to_day,log_time)<7 THEN '新晋用户'
WHEN DATEDIFF(to_day,act)<7 THEN '忠实用户'
WHEN DATEDIFF(to_day,act)>=30 THEN '流失用户'
ELSE '沉睡用户'
END AS user_grade
FROM t1)
SELECT user_grade,
ROUND(COUNT(*)/(select count(*) from t2),2) AS ratio
FROM t2
GROUP BY user_grade
ORDER BY ratio DESC,user_grade