问题:请你找出每个岗位分数排名前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