首页 > 数据库 >SQL中ROW_NUMBER与RANK函数排名区别?

SQL中ROW_NUMBER与RANK函数排名区别?

来源:互联网 2026-07-21 08:31:14

ROW_NUMBER()为每行生成唯一序号,相同值不并列;RANK()相同值排名相同但跳过后续名次;DENSE_RANK()连续排名不跳号。三者均需OVER(ORDERBY...),业务需求决定是否保留并列语义。

在SQL中,排名函数ROW_NUMBER()RANK()DENSE_RANK()看似相似,但实际行为差异显著。选错函数可能导致完全不同的查询结果。核心区别在于:ROW_NUMBER()为每行分配唯一序号,即使排序值重复也会强制编号;RANK()为相同值赋予相同排名,但会跳过后续名次;DENSE_RANK()在并列时紧接排名,不跳过任何数字。三者均依赖于OVER(ORDER BY...)子句,具体选择取决于业务场景是否需要保留并列语义。

SQL中ROW_NUMBER与RANK函数排名区别?

长期稳定更新的攒劲资源: >>>点此立即查看<<<

ROW_NUMBER() 会强行给每行分配唯一序号,哪怕排序值相同

该函数具备“强制唯一编号”特性——无论字段值是否重复,它都会按照ORDER BY的顺序从1开始逐一编号。例如,当两条记录的salary均为8000时,ROW_NUMBER()依然会返回2和3。这并非错误,而是设计初衷:提供唯一序号。

  • 必须与OVER()配合使用,且ORDER BY为必需项;若不指定PARTITION BY,则对全表编号
  • 常用于分页(如WHERE rn BETWEEN 11 AND 20)或取每组最新一条记录(如WHERE rn = 1
  • 若排序字段存在重复值,结果可能不稳定——建议在ORDER BY后追加唯一列(如id)以确保确定性

RANK() 对相同值赋予相同排名,并跳过后续名次

遇到并列情况时,RANK()不会“挤占”排名位置。例如,两个并列第2名之后,下一个排名为第4名,中间的第3名被跳过。这符合体育比赛、考试成绩总分排名等现实逻辑——并列第二之后不会出现第三。

  • 同样依赖OVER(ORDER BY ...),语法结构与ROW_NUMBER()完全一致
  • 适合“取出所有最高分员工”等需求——使用WHERE rk = 1可获取全部并列第一的记录
  • 注意:跳号行为仅在存在重复值时显现;若所有排序字段值均不相同,RANK()ROW_NUMBER()的输出完全一致

选哪个?关键看你要不要保留并列语义

选择函数并非性能或兼容性问题,而是取决于业务意图:

  • 需要唯一行号、实现分页或去重取首条记录 → 使用ROW_NUMBER()
  • 需要真实反映“并列第N名”,允许同名次多行 → 使用RANK()
  • 若觉得RANK()跳号过于跳跃(例如希望并列第2名之后紧跟第3名),则改用DENSE_RANK()

实际使用中容易被忽略的是:三个函数在语法上几乎一模一样,仅靠名称区分。一旦写错,结果偏差往往不明显,直到上线后查数据才发现“怎么少了一条并列记录”或“分页错位了”。因此,编写查询前,务必明确业务需求。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备2026025700号-3 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。