ROW_NUMBER() 是 SQL 中的一个 窗口函数(Window Function),用于为结果集的每一行分配一个唯一的序号(行号),从 1 开始递增。这个函数在处理分页、排名、去重等场景时非常有用。
基本语法
ROW_NUMBER() OVER (
[PARTITION BY column_name(s)]
ORDER BY column_name(s) [ASC | DESC]
)
参数说明:
- PARTITION BY:可选。将数据按指定列分组,每个组内独立编号。
- ORDER BY:必填。定义行号的排序方式。
示例
假设有一个员工表 employees:
id | name | department | salary |
1 | Alice | HR | 6000 |
2 | Bob | IT | 7000 |
3 | Carol | IT | 8000 |
4 | David | HR | 5500 |
5 | Eve | IT | 7500 |
示例 1:全局排序编号
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;
输出:
name | department | salary | row_num |
Carol | IT | 8000 | 1 |
Eve | IT | 7500 | 2 |
Bob | IT | 7000 | 3 |
Alice | HR | 6000 | 4 |
David | HR | 5500 | 5 |
示例 2:按部门分组编号(分区排序)
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_num
FROM employees;
输出:
name | department | salary | row_num |
Carol | IT | 8000 | 1 |
Eve | IT | 7500 | 2 |
Bob | IT | 7000 | 3 |
Alice | HR | 6000 | 1 |
David | HR | 5500 | 2 |
应用场景
场景 | 使用方式 |
分页查询 | 结合 ROW_NUMBER() 实现高效分页 |
去重操作 | 找出每组第一条记录 |
排名分析 | 给每条记录赋予排名 |
数据清洗 | 删除重复记录,保留最新或最早一条 |
注意事项
- ROW_NUMBER() 总是返回唯一的行号,即使排序字段值相同也会分配不同编号。
- 如果需要对相同值赋予相同排名,请使用其他窗口函数如:RANK()或者DENSE_RANK()