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

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

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

这道题目要求我们找出那些用户重复观看次数较高的视频,我们要做的事情如下:

1. 确定总体问题

我们需要找出被重复观看次数排名前三的视频,输出这些视频的课程ID、被重复观看次数和排名。

2. 分析关键问题

  • 连接表:将course_info_tbplay_record_tb表连接起来,以便获取每个视频的观看记录。
  • 计算重复观看次数:对每个视频的观看记录进行计数。
  • 计算排名:根据重复观看次数和发布日期计算排名。
  • 筛选和排序:筛选出重复观看次数大于1且排名在前三的视频。

3. 解决每个关键问题的代码及讲解

步骤1:连接表

我们使用JOINcourse_info_tbplay_record_tb表连接起来:

from
    course_info_tb c
    join play_record_tb p on c.cid = p.cid
  • JOIN play_record_tb p ON c.cid = p.cid:通过课程ID连接两个表,以便获取每个视频的观看记录。
步骤2:计算重复观看次数

我们使用COUNT函数对每个视频的观看记录进行计数,并使用ROUND函数格式化输出:

select
    p.cid,
    round(count(*) * 1.0, 3) as pv
  • COUNT(*):计算每个视频的观看记录数。
  • ROUND(count(*) * 1.0, 3):将观看次数转换为浮点数并保留三位小数。
步骤3:计算排名

我们使用ROW_NUMBER窗口函数根据重复观看次数和发布日期计算排名:

row_number() over (
    order by
        count(*) desc,
        c.release_date desc
) as rk
  • ORDER BY count(*) DESC, c.release_date DESC:按观看次数降序和发布日期降序排序。
  • ROW_NUMBER() OVER (...):为每个视频分配一个排名。
步骤4:筛选和排序

我们使用WHERE子句筛选出重复观看次数大于1且排名在前三的视频,并按排名升序排序:

where
    sub.pv > 1 and sub.rk <= 3
order by
    rk asc
  • WHERE sub.pv > 1 AND sub.rk <= 3:筛选出符合条件的视频。
  • ORDER BY rk ASC:按排名升序排序。

完整代码

select
    sub.cid,
    sub.pv,
    sub.rk
from
    (
        select
            p.cid,
            round(count(*) * 1.0, 3) as pv,
            row_number () over (
                order by
                    count(*) desc,
                    c.release_date desc
            ) as rk
        from
            course_info_tb c
            join play_record_tb p on c.cid = p.cid
        group by
            p.cid,
            p.uid,
            c.release_date
    ) sub
where
    sub.pv > 1 and sub.rk <=3
order by
    rk asc;

全部评论
若某人对某视频只观看了一次,则不计为重复观看次数 ,答案明显不对啊,只是给的例子过了
点赞 回复 分享
发布于 06-26 13:37 江苏
楼上说的应该是对的,官方答案没有对每个用户的重复观看次数做求和
点赞 回复 分享
发布于 06-22 14:14 辽宁
select sub.cid, sum(sub.pv) as pv, sub.rk from ( select p.cid,p.uid, round(count(*) * 1.0, 3) as pv, row_number () over ( order by count(*) desc, c.release_date desc ) as rk from course_info_tb c join play_record_tb p on c.cid = p.cid group by p.cid, p.uid, c.release_date ) sub where sub.pv > 1 and sub.rk <=3 group by sub.cid order by rk asc; 应该对一个视频不同观众观看的重复观看次数进行累加
点赞 回复 分享
发布于 05-25 22:28 山东
大佬~可以问问GROUP BY为何要group by p.cid, p.uid, c.release_date嘛
点赞 回复 分享
发布于 03-17 12:03 浙江

相关推荐

07-16 14:10
门头沟学院 Java
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
06-05 19:46
已编辑
武汉大学 后端
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-18 18:30
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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