OPPO · 排序 · 算法编程题
OPPO 排序 时限 1 秒 / 256 MB

题目描述

现有课程信息表 course_info_tb(cid:课程ID,tag:视频类别,release_date:发布日期,duration:视频时长),示例数据如下:
id
cid
tag
release_date
duration
1
9001
sql
2022-01-01
60
2
9002
sql
2022-01-01
90
3
9003
sql
2022-01-01
45
4
9004
java
2022-01-02
45
用户观看记录表 play_record_tb(uid:用户ID,cid:课程ID,start_time:开始观看时间,end_time:结束观看时间,score:用户评分),示例数据如下:
id
uid
cid
start_time
end_time
score
1
1001
9001
2022-01-01 08:30:00
2022-01-01 09:00:00
4
2
1001
9001
2022-01-03 09:30:00
2022-01-03 10:20:00
2
3
1002
9001
2022-01-01 08:30:00
2022-01-01 09:40:00
3
4
1001
9002
2022-01-02 08:30:00
2022-01-02 09:01:00
2
5
1001
9002
2022-01-11 08:30:00
2022-01-11 08:31:01
3
6
1001
9002
2022-01-05 08:30:00
2022-01-05 08:54:01
2
7
1003
9002
2022-01-05 08:30:00
2022-01-05 08:51:01
4
请找到那些能让用户一遍接一遍重复观看的高回头率视频,输出被重复观看人次数。若某人对某视频只观看了一次,则不计为重复观看次数,如果某人对某视频观看了n次(n>1),则记为该视频重复观看次数+n。如果被重复观看次数一样大,则越晚发布的视频排名越靠前,每个视频的排名为排在他前面的视频个数+1。请找出被重复观看数排名前三的视频,输出这些视频的课程ID、被重复观看次数和排名。结果按排名升序。若被重复观看视频不足三个,按排名全部输出。示例输出如下:
cid
pv
rk
9002
3.000
1
9001
2.000
2

样例共 1 组

样例 1
输入
drop table if exists course_info_tb;
CREATE TABLE course_info_tb (
    id INT auto_increment PRIMARY KEY,
    cid int NOT NULL COMMENT "课程ID",
    tag varchar(10) COMMENT "课程类别",
    release_date date COMMENT "发布日期", 
    duration INT COMMENT "视频时长(分钟)"
)ENGINE=innodb DEFAULT CHARSET=utf8;

INSERT INTO course_info_tb(cid, tag, release_date, duration) VALUES 
     (9001, 'sql', '2022-01-01', 60)
    ,(9002, 'sql', '2022-01-01', 90)
    ,(9003, 'sql', '2022-01-01', 45)
    ,(9004, 'java', '2022-01-02', 45)
;

drop table if exists play_record_tb;
CREATE TABLE play_record_tb (
    id INT auto_increment PRIMARY KEY,
    uid INT NOT NULL COMMENT "用户ID",
    cid INT NOT NULL COMMENT "课程ID",
    start_time datetime COMMENT "开始观看时间", 
    end_time datetime COMMENT "结束观看时间",
    score TINYINT COMMENT "用户评分"
)ENGINE=innodb DEFAULT CHARSET=utf8;

INSERT INTO play_record_tb(uid, cid, start_time, end_time, score) VALUES 
     (1001, 9001, '2022-01-01 08:30:00', '2022-01-01 09:00:00', 4)
    ,(1001, 9001, '2022-01-03 09:30:00', '2022-01-03 10:20:00', 2)
    ,(1002, 9001, '2022-01-01 08:30:00', '2022-01-01 09:40:00', 3)
    ,(1001, 9002, '2022-01-02 08:30:00', '2022-01-02 09:01:00', 2)
    ,(1001, 9002, '2022-01-11 08:30:00', '2022-01-11 08:31:01', 3)
    ,(1001, 9002, '2022-01-05 08:30:00', '2022-01-05 08:54:01', 2)
    ,(1003, 9002, '2022-01-05 08:30:00', '2022-01-05 08:51:01', 4)
输出
9002|3.000|1
9001|2.000|2

算法解析依据一般

考点:排序

限制 1 秒 / 256MB | SQL 题

题目画像

  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

本题是 SQL 题:给出建表语句与目标结果,要求写出查询语句。

建议步骤

  1. 先读样例里的建表语句,理清有哪几张表、每张表的字段含义与关联键。
  2. 明确输出字段与输出顺序——排序、列名、小数位数通常都是得分点。
  3. 需要「按某维度统计」时用 GROUP BY 聚合,过滤分组结果用 HAVING
  4. 需要排名或累计时用窗口函数(ROW_NUMBER()RANK()SUM() OVER)。
  5. 拿样例数据在本地跑一遍,确认输出与样例逐行一致。

易错点:排序方向写反;GROUP BY 后选了非分组字段;没做 ROUND 保留小数;空值参与聚合。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2024年秋招-OPPO-数据分析岗笔试。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解