题解 | #每类试卷得分前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;