SQLPathLab
窗口函数 · 高级

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
orders
idnameamount
1 Alice 1200
2 Bob 900
3 Cindy 1500
4 David 700

运行结果

result
namern
Cindy 1
Alice 2
Bob 3
David 4

常见问题

ROW_NUMBER 和 RANK 有什么区别?

ROW_NUMBER 总是连续编号;RANK 遇到并列名次会跳号。

ROW_NUMBER 一定要写 ORDER BY 吗?

窗口内通常需要 ORDER BY,否则编号顺序没有明确业务含义。

ROW_NUMBER 常用于什么场景?

常用于分组取第一条、去重、分页和生成排序序号。

标签

常用窗口函数

这篇内容是否清楚?