ROW_NUMBER ウィンドウ関数
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
-
オプション。結果を行のセットに分割する 1 つ以上の列式。
- ORDER BY order_list
-
オプション。セット内の行の順序を定義する 1 つ以上の列式。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