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; # 关键在于先排序筛选新用户,再进行时间范围切割!