题解 | #考试分数(三)#

考试分数(三)

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

思路:本题主要的问题就是如何求出每个岗位分数排名前2名的用户

  1. 首先我们先写出应该筛选的语句,并联立两个表
select g1.id, l.name, g1.score
from grade g1 join language l on g1.language_id = l.id
  1. 一般来说,一个表是求不出里面的数据的排名的,除非使用函数或者自连接去进行比较,这里我们使用自连接来解决
select count(distinct g2.score)
from grade g1, grade g2
where g2.score >= g1.score
and g1.language_id = g2.language_id

这里条件的 g2.score >= g1.score 是因为可能存在第1或者第2同分的情况,并列输出

然后就是同岗位比较,所以要使用 g1.language_id = g2.language_id

count(distinct g2.score) 是去重之后的某一分数大于等于所有记录中score的个数。只有小于等于2,才能说明这个score排在了前两名。

  1. 然后就是排序条件
order by name,score DESC,a.id
  1. 联立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;

参考大佬的文章:https://blog.nowcoder.net/n/6bb2432202b24444865c4e78a40a2086?f=comment

SQL练习 文章被收录于专栏

已完成牛客的SQL练习。接下来是算法的练习

全部评论

相关推荐

萧索X:写篮球联赛干嘛,陪老板打篮球吗。还有实习经历要写自己所在岗位具体完成什么工作,自己的任务具体完成了什么需求,给公司带来了哪些量化增长
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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