每组排名前 N 项
本课属于 Coddy SQL 学习旅程的“进阶内容”单元。第 23 课,共 27 课。
“各部门薪酬最高的员工”是教科书式的例子。标准做法始终是使用带有 PARTITION BY 的 ROW_NUMBER(),然后筛选出第 1 行。
WITH ranked AS (
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
)
SELECT name, department, salary FROM ranked WHERE rn = 1想要前 3 名,而不是第 1 名?把 WHERE rn = 1 改成 WHERE rn <= 3。想要允许并列第一吗?把 ROW_NUMBER() 换成 RANK()。
挑战
简单可用的表和列:
employees:id、name、department、salary
返回每个 department 中薪水最高的员工。输出 name、department 和 salary,并按 department 排序。如果某个部门有两名员工并列薪水最高,只返回其中一名:id 较小的那名。
亲手试试
WITH ranked AS (
-- ROW_NUMBER() OVER (PARTITION BY department ORDER BY ...)
)
SELECT name, department, salary FROM ranked WHERE rn = 1
ORDER BY department
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
进阶内容中的所有课
自己练习: SQL 在线编辑器