ROW_NUMBER
为排序或分组后的记录生成连续序号。
本页使用窗口函数或 CTE;MySQL 需要 8.0 及以上版本。
简介
ROW_NUMBER 是窗口函数,会按 OVER 中的排序规则为每行分配连续且不重复的序号,但不会合并或减少结果行。PARTITION BY 可让编号在每个分组中重新开始。窗口中的 ORDER BY 只决定编号;若要保证最终展示顺序,查询本身仍需 ORDER BY。
基础语法
SELECT name, ROW_NUMBER() OVER (ORDER BY amount DESC, id) AS rn FROM orders ORDER BY amount DESC, id;
示例
ROW_NUMBER 示例
按 amount 从高到低为订单编号,使用 id 稳定处理并列值,并在查询末尾重复排序以保证展示次序。
示例数据表
表名:
orders| id | name | amount |
|---|---|---|
| 1 | Alice | 1200 |
| 2 | Bob | 900 |
| 3 | Cindy | 1500 |
| 4 | David | 700 |
运行结果
| name | rn |
|---|---|
| Cindy | 1 |
| Alice | 2 |
| Bob | 3 |
| David | 4 |
常见问题
ROW_NUMBER 和 RANK 有什么区别?
ROW_NUMBER 总是连续编号;RANK 遇到并列名次会跳号。
ROW_NUMBER 一定要写 ORDER BY 吗?
窗口内通常需要 ORDER BY,否则编号顺序没有明确业务含义。
ROW_NUMBER 常用于什么场景?
常用于分组取第一条、去重、分页和生成排序序号。
标签
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。