WITH t1 AS ( SELECT uid, in_time FROM tb_user_log UNION ALL SELECT uid, out_time AS in_time FROM tb_user_log ), t2 AS ( SELECT uid, in_time, RANK() over (PARTITION BY uid ORDER BY uid ASC, in_time ASC ) AS num_1 FROM t1 ), t3 AS ( SELECT uid, DATE (in_time) AS dt FROM t2 WHERE num_1 = 1 ), t4 AS ( # 新用户 SELECT dt, count(uid) AS new_num FROM t3 GROUP BY dt ), t5 AS ( SELECT uid, DATE (in_time) AS dt FROM t2 ), t6 AS ( SELECT dt, count(DISTINCT uid) AS dau FROM t5 GROUP BY dt ) SELECT t6.dt, t6.dau, IFNULL(ROUND(t4.new_num / t6.dau ,2),0.00) AS uv_new_ratio FROM t6 LEFT JOIN t4 ON t6.dt = t4.dt ORDER BY dt; # 关键在于 IFNULL 进行 none 值转化为 0 值