WITH time_point_play_count AS (
-- 生成所有可能的时间点,这里通过对start_time和end_time去重后合并得到
SELECT DISTINCT time_point
FROM (
SELECT start_time AS time_point
FROM play_record_tb
UNION ALL
SELECT end_time AS time_point
FROM play_record_tb
) AS all_time_points
),
video_play_count_at_time AS (
-- 计算每个时间点每个视频的播放量
SELECT
tpc.time_point,
p.cid,
COUNT(p.id) AS play_count
FROM
time_point_play_count tpc
-- 左连接原表,判断每个时间点有多少条记录正在播放同一视频
LEFT JOIN
play_record_tb p
ON
tpc.time_point >= p.start_time AND tpc.time_point < p.end_time
GROUP BY
tpc.time_point, p.cid
),
max_play_count_per_video AS (
-- 找出每个视频的最大播放量
SELECT
cid,
MAX(play_count) AS max_peak_uv
FROM
video_play_count_at_time
GROUP BY
cid
)
-- 筛选出最大播放量排名前三的视频信息并排序,保留三位小数
SELECT
cid,
ROUND(CAST(max_peak_uv as FLOAT), 3) AS max_peak_uv
FROM
max_play_count_per_video
ORDER BY
max_peak_uv DESC
LIMIT 3;