本题使用窗口函数会很方便
思路如下:
1.首先利用窗口函数获取每一种语言下的成绩排名(注:这里要用dense_rank而不是rank
ps:dense_rank与rank()用法相当,但是有一个区别:dense_rank在处理相同的等级时,等级的数值不会跳过。rank则跳过。 比如rank是 1224 dense_rank 会输出1223)
(select id,language_id,score,dense_rank() over(partition by language_id order by score desc) r from grade ) g
该语句获得 每个语言id下的成绩排名
2.接下来只需要从language表中获取语言名 并且限定排名前二 在使用name排序即可
select g.id,l.name,g.score from (select id,language_id,score,dense_rank() over(partition by language_id order by score desc) r from grade ) g ,language l where g.language_id = l.id and g.r<3 order by l.name