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,
DATE_ADD(DATE(in_time),INTERVAL 1 DAY ) AS dt_next,
num_1
FROM t2
WHERE num_1 = 1 AND DATE (in_time) BETWEEN '2021-11-01' AND '2021-11-30'
),
t4 AS (
SELECT dt,
count(uid) AS new_num
FROM t3
GROUP BY dt
),
t5 AS (
SELECT t3.uid,
t3.dt,
t3.dt_next,
DATE(t2.in_time) AS dt_last
FROM t3
LEFT JOIN t2
ON t3.uid = t2.uid AND t3.dt_next = DATE(t2.in_time)
GROUP BY t3.uid,
t3.dt,
t3.dt_next,
dt_last
),
t6 AS (
SELECT dt,
count(dt_last) AS stop_num
FROM t5
GROUP BY dt
),
t7 AS (
SELECT t4.dt,
stop_num,
new_num,
ROUND(stop_num / new_num, 2) AS uv_left_rate
FROM t6
LEFT JOIN t4
ON t6.dt = t4.dt
),
t8 AS (
SELECT dt, uv_left_rate
FROM t7
ORDER BY dt ASC
)
SELECT * FROM t8;
# 关键在于先排序筛选新用户,再进行时间范围切割!