SELECT CASE WHEN DATEDIFF(today,register_day) <= 6 THEN '新晋用户' WHEN DATEDIFF(today,last_active_day) <= 6 THEN '忠实用户' WHEN DATEDIFF(today,last_active_day) <= 29 THEN '沉睡用户' ELSE '流失用户' END user_grade, ROUND(COUNT(*) / SUM(COUNT(*)) OVER(),2) ratio FROM( SELECT DISTINCT uid, MAX(out_time) OVER() today, MAX(out_time) OVER(PARTITION BY uid) last_active_day, MIN(in_time) OVER(PARTITION BY uid) register_day FROM tb_user_log ul )t GROUP BY user_grade ORDER BY ratio DESC, user_grade