SELECT
t1.dt AS dt,
COUNT(t1.uid) AS dau,
ROUND(COUNT(t2.uid) / COUNT(t1.uid), 2) AS uv_new_ratio
FROM (
SELECT
uid,
DATE(in_time) AS dt
FROM tb_user_log
UNION
SELECT
uid,
DATE(out_time) AS dt
FROM tb_user_log
)t1
LEFT JOIN (
SELECT
uid,
DATE(MIN(in_time)) dt
FROM tb_user_log
GROUP BY uid
)t2 ON t1.dt = t2.dt AND t1.uid = t2.uid
GROUP BY t1.dt
ORDER BY dt
本题的妙处在于,可以通过使用COUNT函数分别统计不同表中的同一字段来达到题目要求。
首先准备两个子表,左表为所有用户活跃过的时间,右表为用户第一次登录的时间。使用左连接将这两个表连接起来,那么t2.uid这一字段在用户“不是第一次登录”时值就为NULL。使用COUNT函数分别统计t1.uid和t2.uid,则前者统计的是某日总活跃人数,后者统计的是该日的新用户人数。

京公网安备 11010502036488号