题解|#每天的日活数及新用户占比#
每天的日活数及新用户占比
https://www.nowcoder.com/practice/dbbc9b03794a48f6b34f1131b1a903eb
### 整体的思路是新增一列标注为是否是当天的新用户active_user 当天是新用户:1,当天不是新用户:0
### 每天的日活数 = SUM(active_user)
### 每天的新用户数 = COUNT(active_user)
### 确实是否是当天的新用户时,需要使用窗口函数进行分组比较,而不是使用GROUP BY直接进行分组
# SELECT uid, DATE_FORMAT(in_time,'%Y-%m-%d') AS dt
# FROM tb_user_log
# UNION
# SELECT uid,DATE_FORMAT(out_time,'%Y-%m-%d') AS dt
# FROM tb_user_log
# IF(MIN(dt) OVER(PARTITION BY uid ORDER BY dt) = dt,1,0) AS active_user
# SELECT uid,dt,IF(MIN(dt) OVER(PARTITION BY uid ORDER BY dt) = dt,1,0) AS active_user
# FROM(
# SELECT uid,DATE_FORMAT(in_time,'%Y-%m-%d') AS dt
# FROM tb_user_log
# UNION
# SELECT uid,DATE_FORMAT(out_time,'%Y-%m-%d') AS dt
# FROM tb_user_log
# )t1
SELECT dt,COUNT(active_user) AS dau, ROUND(SUM(active_user)/COUNT(active_user),2) AS uv_new_ratio
FROM(
SELECT uid,dt,IF(MIN(dt) OVER(PARTITION BY uid) = dt,1,0) AS active_user
FROM(
SELECT uid,DATE_FORMAT(in_time,'%Y-%m-%d') AS dt
FROM tb_user_log
UNION
SELECT uid,DATE_FORMAT(out_time,'%Y-%m-%d') AS dt
FROM tb_user_log
)t1
)r2
GROUP BY dt
??????为什么如果用户不是SUM(active_user)?????好奇怪
明白了!!dau是当日活跃用户数,不是当日新增数!!不要混掉
查看21道真题和解析