SELECT -- 最外层查询,获取清洗完成后的数据
cid,round(pv,3),rk
FROM( -- 第二层查询,使用窗口函数对每个视频按照重复播放次数进行排序
SELECT cid,pv,
ROW_NUMBER() OVER(ORDER BY pv DESC,release_date DESC) AS rk
FROM (
SELECT -- 第三层查询,计算每个视频的总共重复播放次数
p1.cid,c1.release_date,
SUM(p1.pv) AS pv
FROM (
SELECT cid,uid, -- 第四层查询,计算每个人重复播放每个视频的次数
CASE WHEN COUNT(*) > 1 THEN COUNT(*) ELSE 0 END AS pv -- 只看一遍不算重复播放
FROM play_record_tb
GROUP BY cid,uid
) AS p1
INNER JOIN course_info_tb AS c1
ON c1.cid = p1.cid
GROUP BY p1.cid,c1.release_date
) AS p2
) AS p3
WHERE rk <=3
ORDER BY rk;