SELECT u_m_a.dt,
# u_m_a.uid
ROUND(COUNT(u_a.dt) / COUNT(u_m_a.dt), 2) AS uv_rate
FROM (
-- 筛选每个用户的最早活跃日期
SELECT uid,
MIN(DATE(in_time)) AS dt
FROM tb_user_log
GROUP BY uid
)u_m_a
LEFT JOIN (
-- 根据解释,当进入时间和离开时间跨天了,则记该用户次日留存
-- 建立用户活跃表
SELECT uid,
DATE(in_time) AS dt
FROM tb_user_log
UNION
SELECT uid,
DATE(out_time) AS dt
FROM tb_user_log
) u_a
ON u_m_a.uid = u_a.uid
AND u_m_a.dt = DATE_SUB(u_a.dt, INTERVAL 1 DAY)
WHERE DATE_FORMAT(u_m_a.dt, '%Y-%m') = '2021-11'
GROUP BY u_m_a.dt
ORDER BY u_m_a.dt