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 值