SQL27 每类试卷得分前3名
题目主要信息:
-
找到每类试卷得分的前3名,如果两人最大分数相同,选择最小分数大者,如果还相同,选择uid大
-
试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间)
-
试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分)
问题拆分:
-
筛选出一个各类标签与用户及排名的表格:
- 标签信息和得分信息分布在两个表格,需要将其用exam_id连接在一起。知识点:join...on...
- 排名是以每个标签每个用户为组的,因此要分组。
group by tag, e_r.uid
知识点:group by - 对每类标签使用分组聚合排名。知识点:row_number() over partition by 排名优先级先是每个用户的最大得分降序,然后是每个用户的最低得分降序,最后用户ID降序。知识点:order by、min()、max()
-
从上述表格中选出排名小于等于3的标签、用户ID及排名。知识点:select...from...where...
代码:
select tag, uid, ranking
from(
select tag, e_r.uid,
row_number() over (partition by tag order by tag, max(score) desc, min(score) desc, e_r.uid desc) as ranking
from exam_record e_r join examination_info e_i
on e_r.exam_id = e_i.exam_id
group by tag, e_r.uid
)ranktable
where ranking <= 3