根据 OVER 子句中的 ORDER BY 表达式,分配一组行中当前行的序号(从 1 开始计数)。如果存在可选的 PARTITION BY 子句,则为每组行重置序号。ORDER BY 表达式中具有相同值的行以非确定性的方式接收不同的行号。
语法
ROW_NUMBER() OVER(
[ PARTITION BY expr_list ]
[ ORDER BY order_list ]
)
参数
- ( )
-
该函数没有参数,但需要空括号。
- OVER
-
适用于 ROW_NUMBER 函数的窗口函数子句。
- PARTITION BY expr_list
-
可选。一个或多个将结果划分成行集的列表达式。
- ORDER BY order_list
-
可选。一个或多个定义集合内的行顺序的列表达式。如果未指定 PARTITION BY,则 ORDER BY 使用整个表。
如果 ORDER BY 未生成唯一顺序或被省略,则行的顺序是不确定的。有关更多信息,请参阅 窗口函数的唯一数据排序。
返回类型
BIGINT
示例
下面的示例使用 WINSALES
表。有关 WINSALES
表的说明,请参阅窗口函数示例的示例表。
以下示例按 QTY 对表进行排序(按升序),然后为每个行分配一个行号。在应用窗口函数结果后,对结果进行排序。
SELECT salesid, sellerid, qty,
ROW_NUMBER() OVER(
ORDER BY qty ASC) AS row
FROM winsales
ORDER BY 4,1;
salesid sellerid qty row
---------+----------+-----+-----
30001 | 3 | 10 | 1
10001 | 1 | 10 | 2
10006 | 1 | 10 | 3
40005 | 4 | 10 | 4
30003 | 3 | 15 | 5
20001 | 2 | 20 | 6
20002 | 2 | 20 | 7
30004 | 3 | 20 | 8
10005 | 1 | 30 | 9
30007 | 3 | 30 | 10
40001 | 4 | 40 | 11
以下示例按 SELLERID 对表进行分区并按 QTY 对每个分区进行排序(按升序顺序),然后为每个行分配一个行号。在应用窗口函数结果后,对结果进行排序。
SELECT salesid, sellerid, qty,
ROW_NUMBER() OVER(
PARTITION BY sellerid
ORDER BY qty ASC) AS row_by_seller
FROM winsales
ORDER BY 2,4;
salesid | sellerid | qty | row_by_seller
---------+----------+-----+-----
10001 | 1 | 10 | 1
10006 | 1 | 10 | 2
10005 | 1 | 30 | 3
20001 | 2 | 20 | 1
20002 | 2 | 20 | 2
30001 | 3 | 10 | 1
30003 | 3 | 15 | 2
30004 | 3 | 20 | 3
30007 | 3 | 30 | 4
40005 | 4 | 10 | 1
40001 | 4 | 40 | 2
以下示例显示了不使用可选子句时的结果。
SELECT salesid, sellerid, qty, ROW_NUMBER() OVER() AS row
FROM winsales
ORDER BY 4,1;
salesid sellerid qty row
---------+----------+-----+-----
30001 | 3 | 10 | 1
10001 | 1 | 10 | 2
10005 | 1 | 30 | 3
40001 | 4 | 40 | 4
10006 | 1 | 10 | 5
20001 | 2 | 20 | 6
40005 | 4 | 10 | 7
20002 | 2 | 20 | 8
30003 | 3 | 15 | 9
30004 | 3 | 20 | 10
30007 | 3 | 30 | 11