SELECT
id,
name,
score
FROM (
SELECT g.id AS id, l.name AS name, g.score AS score,
DENSE_RANK() OVER(PARTITION BY l.name ORDER BY g.score DESC) AS rk
FROM grade g
JOIN language l
ON g.language_id = l.id
) t1
WHERE rk <= 2
ORDER BY name, score DESC, id
非常典型的子查询中的筛选,需要注意的地方在于子查询中的变量名和主查询中的变量名需一致。此外两个表中有相同列名的列但是不是连接列时,似乎在未命名的情况下直接同时查询两个列会报错,比如本题中的grade.id和language.id。

京公网安备 11010502036488号