SQL练习题45:

题目:

牛客每次举办企业笔试的时候,企业一般都会有不同的语言岗位,比如C++工程师,JAVA工程师,Python工程师,每个用户笔试完有不同的分数,现在有一个分数(grade)表简化如下:
 
第1行表示用户id为1的选择了language_id为1岗位的最后考试完的分数为12000,
....
第7行表示用户id为7的选择了language_id为2岗位的最后考试完的分数为11000,

不同的语言岗位(language)表简化如下:



请你找出每个岗位分数排名前2的用户,得到的结果先按照language的name升序排序,再按照积分降序排序,最后按照grade的id升序排序,得到结果如下:
 

程序1:

select g1.id,l.name,g1.score
from grade as g1 inner join language as l 
on g1.language_id=l.id
where (
select count(distinct g2.score)
from grade as g2
where g1.score <= g2.score and g1.language_id = g2.language_id
)<=2
order by l.name,g1.score desc,g1.id;

程序2:

SELECT id ,name,score FROM
(select g.id,l.name,g.score,dense_rank() over(partition by g.language_id order by g.score desc) as rank
FROM grade g INNER JOIN language l ON g.language_id=l.id)
WHERE rank<=2
ORDER BY name,score DESC,id;
原文地址:https://www.cnblogs.com/zhuozige/p/13909322.html