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

长期稳定更新的攒劲资源: >>>点此立即查看<<<
该函数具备“强制唯一编号”特性——无论字段值是否重复,它都会按照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()不会“挤占”排名位置。例如,两个并列第2名之后,下一个排名为第4名,中间的第3名被跳过。这符合体育比赛、考试成绩总分排名等现实逻辑——并列第二之后不会出现第三。
OVER(ORDER BY ...),语法结构与ROW_NUMBER()完全一致WHERE rk = 1可获取全部并列第一的记录RANK()与ROW_NUMBER()的输出完全一致选择函数并非性能或兼容性问题,而是取决于业务意图:
ROW_NUMBER()RANK()RANK()跳号过于跳跃(例如希望并列第2名之后紧跟第3名),则改用DENSE_RANK()实际使用中容易被忽略的是:三个函数在语法上几乎一模一样,仅靠名称区分。一旦写错,结果偏差往往不明显,直到上线后查数据才发现“怎么少了一条并列记录”或“分页错位了”。因此,编写查询前,务必明确业务需求。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述