- 类别:
窗口函数 (排名相关)
ROW_NUMBER¶
返回窗口分区内每行的唯一行号。
行号从 1 开始,并按顺序继续增大。
语法¶
ROW_NUMBER() OVER (
[ PARTITION BY <expr1> [, <expr2> ... ] ]
ORDER BY <expr3> [ , <expr4> ... ] [ { ASC | DESC } ]
)
实参¶
无。
使用说明¶
expr1
和expr2
指定作为分区依据的列或表达式。可以按零个、一个或多个表达式进行分区。例如,假设您正在跨多个州(或省)选择数据,并且希望每个州内的行号从 1 排列到 N;在这种情况下,可以按州进行分区。
如果只需要一个组,则省略
PARTITION BY
子句。expr3
和expr4
指定用于确定行顺序的列或表达式。可以按一个或多个表达式进行排序。例如,如果要按玉米产量依序列出农民,请使用
bushels_produced
列。有关详细信息,请参阅 `示例`_(本主题内容)。
示例¶
按玉米产量降序显示农民,并按该顺序分配行号(玉米产量最高的农民将具有行号 1)。
SELECT state, bushels_produced, ROW_NUMBER() OVER (ORDER BY bushels_produced DESC) FROM corn_production; +--------+------------------+------------+ | state | bushels_produced | ROW_NUMBER | +--------+------------------+------------+ | Kansas | 130 | 1| | Kansas | 120 | 2| | Iowa | 110 | 3| | Iowa | 100 | 4| +--------+------------------+------------+
下面的查询显示了如何在分区中分配行号。在这种情况下,分区是证券交易所(例如,“N”代表“NASDAQ”)。
SELECT
symbol,
exchange,
shares,
ROW_NUMBER() OVER (PARTITION BY exchange ORDER BY shares) AS row_number
FROM trades;
+------+--------+------+----------+
|SYMBOL|EXCHANGE|SHARES|ROW_NUMBER|
+------+--------+------+----------+
|SPY |C | 250| 1|
|AAPL |C | 250| 2|
|AAPL |C | 300| 3|
|SPY |N | 100| 1|
|AAPL |N | 300| 2|
|SPY |N | 500| 3|
|QQQ |N | 800| 4|
|QQQ |N | 2000| 5|
|YHOO |N | 5000| 6|
+------+--------+------+----------+