カテゴリ:

ウィンドウ関数 (ランク関連)

ROW_NUMBER

ウィンドウパーティション内の各行に一意の行番号を返します。

行番号は1から始まり、連続して続きます。

構文

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

引数

なし。

使用上の注意

  • 式1 および 式2 は、パーティション化する列または式を指定します。0、1、またはそれ以上の式でパーティションを分割できます。

    たとえば、複数の州(または県)にわたってデータを選択しており、各州内で1からNまでの行番号が必要であるとします。その場合、状態ごとに分割できます。

    単一のグループのみが必要な場合は、 PARTITION BY 句を省略します。

  • 式3 および 式4 は、行の順序を決定するために使用する列または式を指定します。1個以上の式で指定できます。

    例えば、トウモロコシの生産順に農家をリストしたい場合は、 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|
+--------+------------------+------------+

以下のクエリは、パーティション内で行番号を割り当てる方法を示しています。この場合、パーティションは証券取引所です(例:「NASDAQ」の場合は「N」)。

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|
+------+--------+------+----------+