-- 步骤1:筛选出每个用户对同一视频观看次数>1的记录(计算重复观看的基础数据)
WITH t AS (
SELECT
cid,
uid,
COUNT(*) AS watch_counts -- 每个用户对某视频的观看次数
FROM play_record_tb
GROUP BY cid, uid
HAVING COUNT(*) > 1 -- 仅保留观看次数>1的用户-视频组合
),
-- 步骤2:计算每个视频的重复观看总次数,并按规则排名
t1 AS (
SELECT
t.cid,
-- 格式化pv为三位小数(匹配示例输出格式)
ROUND(SUM(t.watch_counts), 3) AS pv,
-- 排名规则:按重复观看次数降序,次数相同则按发布日期降序
ROW_NUMBER() OVER(
ORDER BY SUM(t.watch_counts) DESC, c.release_date DESC
) AS rk
FROM t
-- 关联课程表获取发布日期(用于排名),补充on关键字修正语法
JOIN course_info_tb c ON t.cid = c.cid
GROUP BY t.cid, c.release_date -- 需包含release_date确保排序正确(因课程表cid唯一,可关联获取)
)
-- 步骤3:筛选排名前三的视频
SELECT
cid,
pv,
rk
FROM t1
WHERE rk <= 3
ORDER BY rk ASC; -- 按排名升序输出