题解 | 被重复观看次数最多的3个视频

被重复观看次数最多的3个视频

https://www.nowcoder.com/practice/b75fa2412659422c96369976ee1f9504

with answer as (
    select
        cid,
        sum(pv) as pv,
        row_number() over(order by sum(pv) desc, release_date desc) as rk
    from (
        select
            c.cid as cid, 
            count(*) as pv,
            release_date
        from
            course_info_tb c
            join play_record_tb p on c.cid = p.cid
        group by c.cid, p.uid, release_date
        having pv > 1
    )as r1
    group by cid, release_date
    order by rk asc
)
select cid, pv, rk from answer where rk <= 3
# 在使用 GROUP BY 时:除了聚合函数中的字段,所有出现在 SELECT 中的字段都必须出现在 GROUP BY 子句中,除非该字段是由 GROUP BY 的字段唯一确定(也就是一一对应)的。
  1. 构建r1表。连接course_info_tb与play_record_tb,按c.cid, p.uid, release_date分组,选取出每个视频中每个用户观看的次数,使用having pv > 1筛选出重复观看的视频,此时得到视频id、被不同用户重复观看的次数、发布日期(用于后续排序)。
  2. 构建开窗函数answer表。对r1进行分组group by cid, release_date,聚合为每个视频总共被重复观看的次数sum(pv) as pv,并进行排序row_number() over(order by sum(pv) desc, release_date desc) as rk,当次数相等时 ,发布晚的视频在前。最后按rk排名排序。
  3. 从开窗函数中取出排名前3的数据。

注意:1.求排名前n的数据,一般都是先构建一张表得到排名rk,再从这张表中使用where取出排名前n的数据;2.在使用 GROUP BY 时:除了聚合函数中的字段,所有出现在 SELECT 中的字段都必须出现在 GROUP BY 子句中,除非该字段是由 GROUP BY 的字段唯一确定(也就是一一对应)的

全部评论

相关推荐

每晚夜里独自颤抖:把华北改为华南再试一试,应该就没啥问题了。改完可能都不用投,别人主动联系了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务