明确问题:找出每个岗位分数排名前2的用户,得到的结果按name升序,再按积分降序,最后按id升序
首先找到每个岗位的排名,可以使用窗口函数,根据题义,可以并列排名,故使用dense_rank进行排名
select *,dense_rank()over(partition by name order by score desc) d_rank
from grade
这样就知道了每个岗位的排名,接下来就是取出前2的用户,再对language进行链接,按name升序,再按积分降序,最后按id升序
select a.id,b.name,a.score from (select *,dense_rank()over(partition by language_id order by score desc) d_rank from grade) a join language as b on a.language_id=b.id where a.d_rank<=2 order by 2,3 desc,1

京公网安备 11010502036488号