Menu
CoddyTech

每组排名前 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()。

challenge icon

挑战

简单

可用的表和列:

  • 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

进阶内容中的所有课

自己练习: SQL 在线编辑器