WITH min_day AS (
SELECT uid, DATE(MIN(in_time)) AS mday
FROM tb_user_log
GROUP BY uid
)
SELECT user_grade,
ROUND(COUNT(DISTINCT uid) / (SELECT COUNT(DISTINCT uid) FROM tb_user_log WHERE in_time IS NOT NULL), 2) AS radio
FROM(
-- 筛选忠实用户
SELECT t_u_l.uid AS uid, '忠实用户' AS user_grade
FROM tb_user_log t_u_l
JOIN min_day m_d
USING(uid)
WHERE DATEDIFF((SELECT DATE(MAX(in_time)) FROM tb_user_log), DATE(in_time)) <= 6
AND DATEDIFF((SELECT DATE(MAX(in_time)) FROM tb_user_log), mday) > 6
UNION ALL
-- 筛选新晋用户
SELECT t_u_l.uid AS uid, '新晋用户' AS user_grade
FROM tb_user_log t_u_l
JOIN min_day m_d
USING(uid)
WHERE DATEDIFF((SELECT DATE(MAX(in_time)) FROM tb_user_log), mday) <= 6
UNION ALL
-- 筛选沉睡用户
SELECT t_u_l.uid AS uid, '沉睡用户' AS user_grade
FROM tb_user_log t_u_l
JOIN min_day m_d
USING(uid)
WHERE t_u_l.uid NOT IN (
SELECT uid
FROM tb_user_log
WHERE DATEDIFF((SELECT DATE(MAX(in_time)) FROM tb_user_log), DATE(in_time)) <= 6
) AND DATEDIFF((SELECT DATE(MAX(in_time)) FROM tb_user_log), mday) <= 29
UNION ALL
-- 筛选流失用户
SELECT t_u_l.uid AS uid, '流失用户' AS user_grade
FROM tb_user_log t_u_l
JOIN min_day m_d
USING(uid)
WHERE t_u_l.uid NOT IN (
SELECT uid
FROM tb_user_log
WHERE DATEDIFF((SELECT DATE(MAX(in_time)) FROM tb_user_log), DATE(in_time)) <= 29
) AND DATEDIFF((SELECT DATE(MAX(in_time)) FROM tb_user_log), mday) > 29
)grade_t
GROUP BY user_grade
ORDER BY radio DESC