












标准语法: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 |
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 开始编号此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。