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的计算结果,但是别写别名