考试分数(三)题解

考试前2分数的学生

http://www.nowcoder.com/questionTerminal/b83f8b0e7e934d95a56c24f047260d91

首先先写出应该筛选的语句,并且把2个表联立起来:
select g1.id, l.name, g1.score
from grade g1 join language l on g1.language_id=l.id 
然后考虑应该怎么输出,一般来说,你无法获得一个表里面数据的排名,除非使用函数或者使用select 连接自己的表去比较,不懂的可以先去看一下 https://blog.nowcoder.net/n/07c24f0c8b7f4f058013f3707ef58f3b
这里考虑的不使用函数,使用select连接自己来解决,于是可以写出如下sql语句来获取当前分数在当前岗位的排名了:
select count(distinct g2.score) 
    from grade g2 
    where g2.score>=g1.score and g1.language_id=g2.language_id
这样要注意的是,第一,由于可能第1或者第2同分的情况,并列输出,所以要用
 g2.score>=g1.score
然后要是同岗位比较,所以要使用
g1.language_id=g2.language_id
不然比较的就是所有岗位的所有分数的排名了。
然后就是先按名字升序,按分数降序,按id降序,如下:
 order by l.name,g1.score desc ,g1.id
最后联立sql如下:
select g1.id, l.name, g1.score
from grade g1 join language l on g1.language_id=l.id 
where 
(
    select count(distinct g2.score) 
    from grade g2 
    where g2.score>=g1.score and g1.language_id=g2.language_id
) <=2 order by l.name,g1.score desc ,g1.id;




全部评论
new bee
1 回复
分享
发布于 2022-01-26 16:26
这么写,如果有三个并列第一,后面还有第四名,就会把这个第四名也输出
2 回复
分享
发布于 2022-05-29 15:04
联想
校招火热招聘中
官网直投
g2.score >= g1.score之后的count 不是应该count >= 2的条件嘛 我的理解是对g2.score逐行找g1中不超过它的值,如12000,count = 2, 13000,count=3
1 回复
分享
发布于 2020-09-15 11:03
题目又改了吗?是按照Id升序的!
点赞 回复
分享
发布于 2021-06-26 22:45
牛逼
点赞 回复
分享
发布于 2021-08-21 12:09
牛逼
点赞 回复
分享
发布于 2021-11-19 14:41
感谢大神,大神牛逼!
点赞 回复
分享
发布于 2021-11-23 10:08
我直接使用的MySQL的窗口函数
点赞 回复
分享
发布于 2022-02-10 19:56
厉害!
点赞 回复
分享
发布于 2022-11-26 14:29 江苏
select n.id, n.name, n.score from ( select g.id, name, score, dense_rank()over(partition by name order by score desc) posn from grade g join language l on g.language_id=l.id )n where n.posn<3
点赞 回复
分享
发布于 2023-07-25 10:38 澳大利亚
妙妙蛙进了妙妙屋
点赞 回复
分享
发布于 03-28 11:02 上海

相关推荐

TP-LINK 前端工程师 年包大概20出头 本科
点赞 评论 收藏
转发
点赞 评论 收藏
转发
43 6 评论
分享
牛客网
牛客企业服务