WITH today AS(
SELECT MAX(DATE(in_time)) FROM tb_user_log
)
SELECT
user_grade,
ROUND(COUNT(uid) / (SELECT COUNT(DISTINCT uid) FROM tb_user_log), 2) AS ratio
FROM
(
SELECT
DISTINCT t1.uid,
CASE
WHEN DATEDIFF((SELECT * FROM today), min_time) <= 6 THEN '新晋用户'
WHEN DATEDIFF((SELECT * FROM today), min_time) > 6 AND DATEDIFF((SELECT * FROM today), max_time) <= 6 THEN '忠实用户'
WHEN DATEDIFF((SELECT * FROM today), max_time) > 6 AND DATEDIFF((SELECT * FROM today), max_time) <= 29 THEN '沉睡用户'
WHEN DATEDIFF((SELECT * FROM today), max_time) > 29 THEN '流失用户'
END AS user_grade
FROM (
SELECT
uid,
DATE(MIN(in_time)) AS min_time,
DATE(MAX(in_time)) AS max_time
FROM tb_user_log
GROUP BY uid
) t1
JOIN tb_user_log t2 ON t1.uid = t2.uid
)t2
GROUP BY user_grade
ORDER BY ratio DESC
一定要利用好子查询“准备好”要使用的字段,除此之外DISTINCT不能忘了。

京公网安备 11010502036488号