# 组合两个表的记录时间,计算每个用户的最早日期(用来判断是否是新用户)
# 


WITH temp_0 AS( # 临时表0 组合两个不同的时间到一列
    SELECT uid, DATE_FORMAT(in_time, '%Y-%m-%d') _date
    FROM tb_user_log
    UNION 
    SELECT uid, DATE_FORMAT(out_time, '%Y-%m-%d') _date
    FROM tb_user_log
    ),
    temp_1 AS( # 临时表1 开窗函数,找到每个用户最早的登录日期
    SELECT uid, _date, MIN(_date) OVER(PARTITION BY uid) first_date
    FROM temp_0
    ),
    temp_2 AS( # 临时表2 分组语句。根据日期分组,求得每天的活跃数,结合求和聚合函数求得每天活跃的是新用户的数量
    SELECT _date, COUNT(DISTINCT uid) dau, SUM(IF(_date = first_date, 1, 0)) new_dau
    FROM temp_1
    GROUP BY _date
    )

# 主查询简单除法即可
SELECT _date dt, dau, ROUND(new_dau/dau, 2) uv_new_ratio
FROM temp_2
ORDER BY dt

饿饿饿,点个外卖吃