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

考试分数(三)

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练习。接下来是算法的练习

全部评论

相关推荐

KPLACE:首先是板面看起来不够,有很多奖,比我厉害。项目要精减,大概详细描述两到三个,要把技术栈写清楚,分点,什么算法,什么外设,怎么优化,不要写一大堆,分点,你写上去的目的,一是让别人知道你做了这个知识点,然后在面试官技术面的时侯,他知道你会这个,那么就会跟你深挖这个,然后就是个人评价改为专业技能
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务