-- 建立活跃用户表
WITH act_user AS (
    SELECT uid,
        DATE(in_time) AS dt
    FROM tb_user_log
    UNION
    SELECT uid,
        DATE(out_time) AS dt
    FROM tb_user_log
)

SELECT dt, dau,
    ROUND(IF(new_user_cnt IS NULL, 0, new_user_cnt / dau), 2) AS uv_new_ratio
FROM (
    -- 计算当天的活跃用户数
    SELECT dt,
        COUNT(DISTINCT uid) AS dau
    FROM act_user
    GROUP BY dt
) t_act_user
LEFT JOIN (
    SELECT dt,
        COUNT(DISTINCT uid) AS new_user_cnt
    FROM (
        -- 计算用户的最早活跃日期
        SELECT uid,
            MIN(DATE(in_time)) AS dt
        FROM tb_user_log
        GROUP BY uid
    ) first_act_day
    GROUP BY dt
)new_user USING(dt)
ORDER BY dt