# 先找到新用户
# 在找次日登录用户(用户登录表,涵盖进入时间和离开时间跨天情况)
# 最后计算次日留存 COUNT(tb1.uid) / COUNT(tb2.uid)
SELECT
    reg_dt AS dt,
    ROUND(COUNT(tb2.uid) / COUNT(tb1.uid), 2) AS uv_left_rate
FROM(
SELECT
    uid,
    MIN(DATE(in_time)) AS reg_dt
FROM tb_user_log
GROUP BY uid
) AS tb1 # 找到新用户表
LEFT JOIN (
    SELECT 
        uid,
        DATE(in_time) AS log_dt
    FROM tb_user_log
    UNION
    SELECT
        uid,
        DATE(out_time) AS log_dt
    FROM tb_user_log
) AS tb2 # 用户登录表,涵盖进入时间和离开时间跨天情况
ON tb1.uid = tb2.uid AND tb2.log_dt = DATE_ADD(tb1.reg_dt, INTERVAL 1 DAY) # 条件3:次日留存,登录时间=注册时间+1天
WHERE DATE_FORMAT(reg_dt, '%Y-%m') = '2021-11' # 条件1
GROUP BY reg_dt
ORDER BY dt ASC # 条件2