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

每类试卷得分前3名

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

select 
* from(select 
tag,
uid,
ROW_NUMBER() over (partition by e.tag order by max(r.score)desc,min(score)desc,uid desc) as ranking 
from 
examination_info as e #表1
right join 
exam_record as r #表2
on e.exam_id =r.exam_id 
group by tag,uid) t 
where ranking<=3

# 考核知识点:

# rank() dense_rank(),row_number()三种排名函数的使用

rank() 考虑数据的重复性 ,挤占坑位 1,2,2,4

dense_rank() 考虑数据重复性,不挤占坑位 1,2,2,3

row_number() 不考虑数据的重复性,按照顺序依次标上顺序 1,2,3,4

思路:

1,先计算出tag的排名,ROW_NUMBER() over (partition by e.tag order by max(r.score)desc,min(score)desc,uid desc) as ranking ,分组依据为tag,排序依据为'分数的最大值-倒序,分数的最小值-倒序,uid-倒序

2,外层嵌套查询,查询想要的数据,select* from(select.......),因为要获取前三名,所以外层查询使用内层查询的相关字段进行过滤,

where ranking<=3

个人认为最难的部分是:ROW_NUMBER() over (partition by e.tag order by max(r.score)desc,min(score)desc,uid desc) as ranking

全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务