标准语法:ROW_NUMBER() OVER ([PARTITION BY 列...] ORDER BY 列 [ASC|DESC])
返回值:从 1 开始递增的唯一整数,即使排序字段值相同,行号也不重复(强制去重排序)。
执行逻辑:先按 ORDER BY 排序,再分配行号;支持 PARTITION BY 分组内独立编号 。
关键区别:ROW_NUMBER() 是分析函数(必须配 OVER),ROWNUM 是查询结果集的伪列(分配早于排序,不可直接用于排序后分页)
三大排名函数对比(处理重复值策略)
| 函数 | 重复值处理 | 序号连续性 | 示例(值:90, 90, 80) |
|---|---|---|---|
| ROW_NUMBER() | 强制区分,任意分配不同序号 | 连续 | 1, 2, 3 |
| DENSE_RANK() | 相同值同排名,后续紧接 | 连续 | 1, 1, 2 |
| RANK() | 相同值同排名,后续跳过空缺 | 不连续 | 1, 1, 3 |
- PARTITION BY(可选):指定分组字段,组内序号从 1 重新开始;省略则全结果集视为一个分区。
- ORDER BY(必填):决定行号生成顺序,支持多列排序及升降序组合。
- 特性:即使排序列值相同,
ROW_NUMBER()仍强制分配不同序号(不并列、不跳过),保证全局/组内唯一连续递增
=================有 PARTITION BY 与无 PARTITION BY 的核心区别====================
ROW_NUMBER() 有 PARTITION BY 与无 PARTITION BY 的核心区别在于:编号是否重置。有则按组独立从 1 开始编号,无则全结果集连续从 1 编号 。
核心差异对比
- 带
PARTITION BY:将结果集按指定列划分为多个“窗口(分区)”,每个分区内独立从 1 开始连续编号;常用于组内排名、去重取第一条等场景。 - 不带
PARTITION BY:将整个结果集视为单一窗口,全局连续从 1 开始编号;常用于整体排序分页或唯一行标记。 - 语法共性:两者均必须配合
OVER(...)使用,且通常需包含ORDER BY以确定编号顺序(若缺ORDER BY,编号顺序不确定)。
- 无分区(全局编号):
ROW_NUMBER() OVER (ORDER BY sal DESC)→ 所有行按工资降序排,序号 1,2,3... 贯穿全表。 - 有分区(组内编号):
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC)→ 先按部门分组,每个部门内部按工资降序重新从 1 开始编号
