类别:

窗口函数 (排名相关)

ROW_NUMBER

返回窗口分区内每行的唯一行号。

行号从 1 开始,并按顺序继续增大。

语法

ROW_NUMBER() OVER (
  [ PARTITION BY <expr1> [, <expr2> ... ] ]
  ORDER BY <expr3> [ , <expr4> ... ] [ { ASC | DESC } ]
  )
Copy

实参

无。

使用说明

  • expr1expr2 指定作为分区依据的列或表达式。可以按零个、一个或多个表达式进行分区。

    例如,假设您正在跨多个州(或省)选择数据,并且希望每个州内的行号从 1 排列到 N;在这种情况下,可以按州进行分区。

    如果只需要一个组,则省略 PARTITION BY 子句。

  • expr3expr4 指定用于确定行顺序的列或表达式。可以按一个或多个表达式进行排序。

    例如,如果要按玉米产量依序列出农民,请使用 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|
+--------+------------------+------------+
Copy

下面的查询显示了如何在分区中分配行号。在这种情况下,分区是证券交易所(例如,“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|
+------+--------+------+----------+
Copy
语言: 中文