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

每类试卷得分前3名

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

每类试卷得分的前N名问题 可以归类为: 分组按试卷不同先分类+ 排序问题前N名

分组排序问题最常见的思路就是采用窗口函数

1.row_number() 2.rank() 3.dense_rank()

本题思路: 先使用窗口函数row_number()对tag进行分组,再按照题目要求的顺序”如果两人最大分数相同,选择最小分数大者,如果还相同,选择uid大者“ 对分组的成级排序,将该表命名为t

select tag, uid,
       row_number() over(partition by tag order by max(score) desc, min(score) desc, uid desc) irank
from exam_record er
left join examination_info ei on er.exam_id = ei.exam_id
group by tag, uid

然后在从表t中找出的前3名,按照题目要求的列名,整合全部代码如下:

select tag as tid, uid, irank as ranking 
from(
    select tag, uid,
    row_number() over(partition by tag order by max(score) desc, min(score) desc, uid desc) irank
    from exam_record er
    left join examination_info ei on er.exam_id = ei.exam_id
    group by tag, uid) t
where irank <= 3;
全部评论

相关推荐

点赞 评论 收藏
分享
自学java狠狠赚一...:骗你点star的,港卵公司,记得把star收回去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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