ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ROW_NUMBER()

2026/8/5 23:20:56 拓冰建站 浏览量
ROW_NUMBER()

标准语法‌: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,编号顺序不确定)。‌‌
  1. ‌无分区(全局编号)‌:ROW_NUMBER() OVER (ORDER BY sal DESC) → 所有行按工资降序排,序号 1,2,3... 贯穿全表。
  2. ‌有分区(组内编号)‌:ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) → 先按部门分组,‌每个部门内部‌按工资降序重新从 1 开始编号