题解 | 2021年11月每天新用户的次日留存率
2021年11月每天新用户的次日留存率
https://www.nowcoder.com/practice/1fc0e75f07434ef5ba4f1fb2aa83a450
WITH all_active AS ( -- 这里将数据连起来其实是因为有坑,可能以为人晚上看,结束的时候已经是第二天凌晨了
-- 拆成两条记录,取 in_time/out_time 的日期,并去重
SELECT DISTINCT uid, DATE(in_time) AS active_day
FROM tb_user_log
WHERE in_time IS NOT NULL
UNION
SELECT DISTINCT uid, DATE(out_time) AS active_day
FROM tb_user_log
WHERE out_time IS NOT NULL
) ,
xia As ( --这里是查询下一天的阅读日期
SELECt
uid,
active_day,
LEAD(active_day) OVER(PARTITION BY uid ORDER BY active_day ASC) AS next_time
FROM all_active
)
,
new_user_daily AS ( --这里查询第一次登陆的时间
SELECT
MIN(active_day) AS dt,
uid
FROM all_active
GROUP BY uid
HAVING MONTH(dt) = 11
),
daily_retention AS ( --这里进行表链接,按首次登陆时间和uid进行链接
SELECT
n.dt,
COUNT(DISTINCT n.uid) AS new_user_count,
COUNT(DISTINCT CASE
WHEN DATE_ADD(n.dt, INTERVAL 1 DAY) = a.next_time THEN n.uid
END) AS retained_next_day
FROM new_user_daily n
LEFT JOIN xia a
ON n.uid = a.uid
AND n.dt = a.active_day
GROUP BY n.dt
)
SELECT
DATE_FORMAT(dt, '%Y-%m-%d') AS dt,
ROUND(retained_next_day * 1.0 / new_user_count, 2) AS uv_left_rate
FROM daily_retention
WHERE new_user_count > 0
ORDER BY dt;

