- カテゴリ:
ウィンドウ関数 (ランク関連、ウィンドウフレーム)
RANK¶
値が順序付けられたグループ内の値のランクを返します。
ランク値は1から始まり、連続して増加していきます。
2つの値が同じ場合、それらのランクは同じになります。
構文¶
RANK() OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
window_frame
構文の詳細については、 ウィンドウフレームの構文と使用法 をご参照ください。
引数¶
なし。
関数自体は、ウィンドウ内の現在の行のランク(相対位置)を返すため、引数を取りません。これは、 <expr2>
によって順序付けられます。ウィンドウの順序によってランクが決まるため、追加のパラメーターを RANK 関数に渡す必要はありません。
使用上の注意¶
expr1
ウィンドウを分割する列または式。たとえば、各州で生産したトウモロコシの量で農家を順番にランク付けするとします。この場合、状態ごとにパーティション分割します。
単一のグループのみが必要な場合(例: 米国のどの州に住んでいるかに関係なくすべての農家をランク付けする場合)は、
PARTITION BY
句を省略します。expr2
並べ替える(ランクする)列または式。たとえば、農家をランキングして、誰が(州内で)最も多くのトウモロコシを生産したかを見る場合、
bushels_produced
列を使用します。詳細については、 例 (このトピック内)をご参照ください。同じ値は同じランク値になります。ただし、同じ値のため順序にギャップが生じます。
たとえば、最初の3行が
1
を返す場合、 RANK は2
と3
をスキップして、グループの次の行に4
を割り当てます。ギャップを回避するには、代わりに DENSE_RANK 関数を使用します。
例¶
テーブルとデータを作成します。
-- Create table and load data. create or replace table corn_production (farmer_ID INTEGER, state varchar, bushels float); insert into corn_production (farmer_ID, state, bushels) values (1, 'Iowa', 100), (2, 'Iowa', 110), (3, 'Kansas', 120), (4, 'Kansas', 130);
農家のトウモロコシ生産量を降順で表示し、個々の農家の生産高のランクを表示します(最高 = 1
)。
SELECT state, bushels, RANK() OVER (ORDER BY bushels DESC), DENSE_RANK() OVER (ORDER BY bushels DESC) FROM corn_production; +--------+---------+-------------------------------------+-------------------------------------------+ | STATE | BUSHELS | RANK() OVER (ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (ORDER BY BUSHELS DESC) | |--------+---------+-------------------------------------+-------------------------------------------| | Kansas | 130 | 1 | 1 | | Kansas | 120 | 2 | 2 | | Iowa | 110 | 3 | 3 | | Iowa | 100 | 4 | 4 | +--------+---------+-------------------------------------+-------------------------------------------+
各州内で、農家のトウモロコシ生産量を降順で示し、各農家の生産量のランクを表示します(最高 = 1
)。
SELECT state, bushels, RANK() OVER (PARTITION BY state ORDER BY bushels DESC), DENSE_RANK() OVER (PARTITION BY state ORDER BY bushels DESC) FROM corn_production; +--------+---------+--------------------------------------------------------+--------------------------------------------------------------+ | STATE | BUSHELS | RANK() OVER (PARTITION BY STATE ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (PARTITION BY STATE ORDER BY BUSHELS DESC) | |--------+---------+--------------------------------------------------------+--------------------------------------------------------------| | Iowa | 110 | 1 | 1 | | Iowa | 100 | 2 | 2 | | Kansas | 130 | 1 | 1 | | Kansas | 120 | 2 | 2 | +--------+---------+--------------------------------------------------------+--------------------------------------------------------------+
以下のクエリと出力は、 RANK() と DENSE_RANK() 関数の両方で処理する方法を示しています。DENSE_RANK の場合、ランクは 1
、 2
、 3
、 3
、 4
です。RANK() 関数からの出力とは異なり、ランク 3
に同じ値があったため、ランク 4
はスキップされません。
SELECT state, bushels, RANK() OVER (ORDER BY bushels DESC), DENSE_RANK() OVER (ORDER BY bushels DESC) FROM corn_production; +--------+---------+-------------------------------------+-------------------------------------------+ | STATE | BUSHELS | RANK() OVER (ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (ORDER BY BUSHELS DESC) | |--------+---------+-------------------------------------+-------------------------------------------| | Kansas | 130 | 1 | 1 | | Kansas | 120 | 2 | 2 | | Iowa | 110 | 3 | 3 | | Iowa | 110 | 3 | 3 | | Iowa | 100 | 5 | 4 | +--------+---------+-------------------------------------+-------------------------------------------+