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()