题解 | #每类试卷得分前3名#

每类试卷得分前3名

http://www.nowcoder.com/practice/255aa1863fe14aa88694c09ebbc1dbca

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
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论
哈哈哈, 又学到了. row_number() 原来可以这么用,谢谢大佬
3 回复 分享
发布于 2021-11-21 09:54
请问为什么group by uid, 是因为row_number() 吗 能不能详细讲讲?
3 回复 分享
发布于 2022-02-28 09:48
row_number中order by最后一个uid为什么也需要降序desc呢?如果不降序确实结果不对,但是没想明白原因,求助大神
1 回复 分享
发布于 2021-12-13 10:16
不太理解为什么要order by max(score) desc, min(score) desc,这一步骤想不通逻辑,为什么不能直接order by score呢
点赞 回复 分享
发布于 2022-04-21 11:39
问一下,为啥窗口函数中要对tag排序
点赞 回复 分享
发布于 2022-03-16 18:00
为什么要嵌套了呢,不能直接select窗口函数吗
点赞 回复 分享
发布于 2022-03-06 18:33
我想请问为什么窗口函数里面有分类还需要用group by先分类呢
点赞 回复 分享
发布于 2022-03-06 15:25
大佬思路好清晰,赞
点赞 回复 分享
发布于 2022-03-06 12:50
表关联条件错了
点赞 回复 分享
发布于 2021-12-24 10:34
为什么我写完总是不通过呢?哪位大神帮忙看看 select tag, uid, ranking from ( select tag, e_r.uid, row_number() over (partition by tag order by max(score) desc, min(score) desc, e_r.uid desc) as ranking from exam_record as e_r join examination_info as e_i on e_r.exam_id = e_r.exam_id group by tag, e_r.uid) as t where ranking <=3;
点赞 回复 分享
发布于 2021-12-15 16:28
我想问个问题:为什么不能在group by后面执行having,而要套一层,我知道大概是执行顺序的问题,但能解释清楚一点么。 另外,发现窗口函数中排序可以使用表达式(如函数)
点赞 回复 分享
发布于 2021-12-10 20:00
order by 后面的tag是不是可以不要
点赞 回复 分享
发布于 2021-11-11 11:07

相关推荐

牛客85811352...:1希音不知道算不算大厂 2完全符合,过得很舒服, 3确实只有杂活 领导找我续签到明年3、4月我要继续吗。主要是边实习边秋招这段时间还是有点累
什么是优秀的实习经历
点赞 评论 收藏
分享
10-31 20:07
门头沟学院 Java
点赞 评论 收藏
分享
评论
67
13
分享

创作者周榜

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