如何用SQL的ROW_NUMBER函数查询每个部门薪资前三名的员工?
- 内容介绍
- 相关推荐
本文共计869个文字,预计阅读时间需要4分钟。
在SQL查询中,`ROW_NUMBER()` 是一个窗口函数,用于为结果集中的每一行分配一个唯一的序号。它不能直接像普通函数那样使用,而是需要明确指定分组依据和排序方式。
以下是一个示例,说明如何使用 `ROW_NUMBER()` 来按部门(`department`)和薪资(`salary`)降序排列,并为每个部门内的员工分配序号:
常见错误是漏掉 PARTITION BY,结果得到的是全表连续排名,而不是每个部门独立排前三。
- 正确写法:
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) - 错误写法:
ROW_NUMBER() OVER (ORDER BY salary DESC)(全表排名) - 如果部门字段含空值,
PARTITION BY会把所有NULL归为同一组,需提前WHERE department IS NOT NULL
WHERE 不能直接过滤窗口函数结果
ROW_NUMBER() 是在 SELECT 阶段计算的,而 WHERE 在逻辑执行顺序中早于 SELECT,所以不能在同一个查询里写 WHERE rn —— 会提示“列不存在”或“无效标识符”。
必须用子查询或 CTE 把带排名的结果先算出来,再外层筛选。
本文共计869个文字,预计阅读时间需要4分钟。
在SQL查询中,`ROW_NUMBER()` 是一个窗口函数,用于为结果集中的每一行分配一个唯一的序号。它不能直接像普通函数那样使用,而是需要明确指定分组依据和排序方式。
以下是一个示例,说明如何使用 `ROW_NUMBER()` 来按部门(`department`)和薪资(`salary`)降序排列,并为每个部门内的员工分配序号:
常见错误是漏掉 PARTITION BY,结果得到的是全表连续排名,而不是每个部门独立排前三。
- 正确写法:
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) - 错误写法:
ROW_NUMBER() OVER (ORDER BY salary DESC)(全表排名) - 如果部门字段含空值,
PARTITION BY会把所有NULL归为同一组,需提前WHERE department IS NOT NULL
WHERE 不能直接过滤窗口函数结果
ROW_NUMBER() 是在 SELECT 阶段计算的,而 WHERE 在逻辑执行顺序中早于 SELECT,所以不能在同一个查询里写 WHERE rn —— 会提示“列不存在”或“无效标识符”。
必须用子查询或 CTE 把带排名的结果先算出来,再外层筛选。

