# 新晋用户:从当天开始近7天新增用户 DATEDIFF('当天', '用户最早登录时间') <= 6
# 忠实用户:从当天开始近7天活跃用户但非新晋用户 直接ELSE就完事儿了
# 沉睡用户:从当天开始7天到30天内活跃过的用户 DATEDIFF('当天', '用户最晚登出时间') BETWEEN 7 AND 29
# 流失用户:从当天开始30天之前活跃过的用户 DATEDIFF('当天', '用户最晚登出时间') > 29

SELECT
    user_grade,
    ROUND(COUNT(user_grade) / (SELECT COUNT(DISTINCT uid) FROM tb_user_log), 2) AS ratio # 计算ratio
FROM(
SELECT # 第二步 使用 CASE WHEN 进行用户分类
    uid,
CASE
    WHEN DATEDIFF((SELECT MAX(DATE(out_time)) FROM tb_user_log), reg_dt) <= 6 THEN '新晋用户'
    WHEN DATEDIFF((SELECT MAX(DATE(out_time)) FROM tb_user_log), recent_dt) BETWEEN 7 AND 29 THEN '沉睡用户'
    WHEN DATEDIFF((SELECT MAX(DATE(out_time)) FROM tb_user_log), recent_dt) > 29 THEN '流失用户'
    ELSE '忠实用户'
END AS user_grade
FROM(
    SELECT # 第一步先创建最早登录,最晚登出时间表
        uid,
        MIN(DATE(in_time)) AS reg_dt, # 用户最早登录时间
        MAX(DATE(out_time)) AS recent_dt # 用户最晚登出时间
    FROM tb_user_log
    GROUP BY uid 
) AS tb1
) AS tb2
GROUP BY user_grade
ORDER BY ratio DESC