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()
真正容易被忽略的是:三个函数在语法上几乎一模一样,仅靠名字区分;一旦写错,结果偏差往往不明显,直到上线后查数据才发现“怎么少了一条并列记录”或者“分页错位了”。