SQL练习题45:
题目:
牛客每次举办企业笔试的时候,企业一般都会有不同的语言岗位,比如C++工程师,JAVA工程师,Python工程师,每个用户笔试完有不同的分数,现在有一个分数(grade)表简化如下:
![](https://uploadfiles.nowcoder.com/images/20200817/557336_1597652427039_07E19104EBD63DA9EDB41F5DD4489F99)
第1行表示用户id为1的选择了language_id为1岗位的最后考试完的分数为12000,
....
第7行表示用户id为7的选择了language_id为2岗位的最后考试完的分数为11000,
不同的语言岗位(language)表简化如下:
第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;