应根据处理并列数据的需求选择:ROW_NUMBER严格排序、无并列;RANK并列跳号(如1、1、3);DENSE_RANK并列不跳号(如1、1、2)。

选哪个函数,关键看你要怎么处理并列数据。
ROW_NUMBER:严格排序,不给并列留位置
它不管值是否相同,只按顺序硬生生排 1、2、3、4……每个行都有唯一编号。适合需要“取前 N 条”或“分页时确保唯一顺序”的场景。
- 相同值会被强行拆开,比如两个 95 分,可能标成第 2 名和第 3 名
- 常用于分页(如查第 11–20 行)、去重(配合 PARTITION BY 取每组第一条)
- 语法简单:ROW_NUMBER() OVER (ORDER BY score DESC)
RANK:并列就跳号,强调名次感
值相等就同名次,但会跳过后续编号。比如两个并列第 1,下一个就是第 3 名。适合打分排名、竞赛名次这类“名次即荣誉”的场景。
- 95、95、90 → 排名是 1、1、3(中间跳了 2)
- 能清晰看出“有多少人比我强”,但总人数和最大名次可能对不上
- 语法:RANK() OVER (ORDER BY score DESC)
DENSE_RANK:并列不跳号,连续紧凑
值相等也同名次,但后续编号紧接上一个名次。比如两个并列第 1,下一个就是第 2 名。适合需要连续等级划分(如 A/B/C 档)或统计各档人数的场景。
- 95、95、90 → 排名是 1、1、2(没跳号)
- 名次数量最少,便于做分段统计(如“前 3 名”“前 5 档”)
- 语法:DENSE_RANK() OVER (ORDER BY score DESC)
记住一句话:要唯一序号用 ROW_NUMBER;要体现“并列即同名次且跳空位”用 RANK;要并列同名次但不跳空位,用 DENSE_RANK。










