- カテゴリ:
ウィンドウ関数 (ランク関連)
ROW_NUMBER¶
ウィンドウパーティション内の各行に一意の行番号を返します。
行番号は1から始まり、連続して続きます。
構文¶
ROW_NUMBER() OVER (
[ PARTITION BY <expr1> [, <expr2> ... ] ]
ORDER BY <expr3> [ , <expr4> ... ] [ { ASC | DESC } ]
)
引数¶
なし。
使用上の注意¶
expr1
およびexpr2
は、パーティション化する列または式を指定します。0、1、またはそれ以上の式でパーティションを分割できます。たとえば、複数の州(または県)にわたってデータを選択しており、各州内で1からNまでの行番号が必要であるとします。その場合、状態ごとに分割できます。
単一のグループのみが必要な場合は、
PARTITION BY
句を省略します。expr3
およびexpr4
は、行の順序を決定するために使用する列または式を指定します。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|
+------+--------+------+----------+