SELECT cid, pv, rk
FROM (
    SELECT 
        c.cid, 
        (COUNT(p.uid)-count(distinct p.uid))*1.000+1 AS pv, 
        c.release_date,
        ROW_NUMBER() OVER (ORDER BY (COUNT(p.uid)-count(distinct p.uid))*1.000 DESC,c.release_date desc) AS rk
    FROM course_info_tb c
    JOIN play_record_tb p ON c.cid = p.cid
    GROUP BY c.cid, c.release_date
    HAVING (COUNT(p.uid)-count(distinct p.uid))*1.000 >= 1
) b
WHERE rk < 4
ORDER BY rk;

参考了ai的答案如上,这题我本来想的是先用count算pv,然后外层写个查询算rk,同时重新连接题目中的表取出release_date,最后再写个查询取出rk<4的部门,但总是有问题,最终参考ai,可以用两个子查询写出来。

其中:

1)重复的播放次数=A视频的总播放数-A视频的去重总观看人数,题目要取的是该视频的所有播放次数(感觉这里题目设置有点奇怪,应该就取重复的播放次数),而题目实例数据中基本上一个视频只被一个用户重复观看,因此在重复的播放次数基础上加1(如果觉得很绕,可以对着实例数据梳理下)

2)select 字段A,字段B----字段B可以引用字段A的计算结果,但是别写别名