使用 row_number() 窗口函数配合 partition by 和 order by 子句,可以高效实现分组取前 n 条记录。具体做法是在查询中计算每组的行号,然后在外部查询中过滤行号小于等于 n 的记录,从而得到每个分组的 top n 数据。

如何为每组数据生成唯一的行号?
ROW_NUMBER() 会为分区内的每一行分配一个从 1 开始的唯一整数序号。它不处理并列情况,即使排序字段值相同,行号也会强制递增。要实现这一点,只需在 OVER 子句中指定分区列和排序列即可。

SELECT
department,
employee_name,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as rn
FROM employees;
上述 SQL 语句将 employees 表按 department 分组,并在组内按 salary 降序排列。结果集中会新增一列 rn,表示该行在其部门中的排名。例如,如果销售部有两名员工薪资相同且最高,他们的 rn 分别为 1 和 2,而不是都为 1。
如何筛选出每组的前 N 名?
生成行号后,通过外层查询过滤 rn 即可获取前 N 名。通常使用子查询或 CTE(公用表表达式)来包裹带有窗口函数的查询,以便在外层进行条件筛选。这种方法逻辑清晰,且能确保只返回需要的行数。

RankedEmployees











