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

问题拆解:1.先按照分组求出每个分组的成绩排名前两名,用dense_rank是因为有并列的情况,并且都需要展示,例如100,100,99,98 排名为1,1,2,3,

(SELECT language_id, score, id, DENSE_RANK() OVER(PARTITION BY
 language_id ORDER BY score DESC) AS r FROM grade
 GROUP BY language_id, score, id
 ) re

2.提取需要的id,score字段,链接language表格,提取name

3.设定筛选条件排名前2名,所以排名=1或排名=2两种情况

4.根据要求orderby即可。

以上。


SELECT re.id, l.name, re.score FROM 
    (SELECT language_id, score, id, DENSE_RANK() OVER(PARTITION BY
     language_id ORDER BY score DESC) AS r FROM grade
     GROUP BY language_id, score, id
     ) re
JOIN language l ON re.language_id=l.id
WHERE r=1 or r=2
ORDER BY l.name, re.score desc, re.id