カテゴリ:

ウィンドウ関数 (ランク関連、ウィンドウフレーム)

DENSE_RANK

値のグループ内の値のランクを返します。ランクにギャップはありません。

ランク値は1から始まり、連続して続きます。

2つの値が同じ場合、それらのランクは同じになります。

構文

DENSE_RANK() OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ ASC | DESC ] [ <window_frame> ] )

ウィンドウフレーム 構文の詳細については、 ウィンドウフレームの構文と使用法 をご参照ください。

引数

式1

ウィンドウを分割する列または式。

例えば、各州で生産したトウモロコシの量で農家を順番にランク付けするとします。この場合、状態ごとにパーティション分割します。

単一のグループのみが必要な場合(例:どの州に住んでいるかに関係なくすべての農家をランク付けする場合)、 PARTITION BY 句を省略します。

式2

並べ替える(ランクする)列または式。

例えば、農家をランキングして、誰が(州内で)最も多くのトウモロコシを生産したかを見る場合、 bushels_produced 列を使用します。詳細については、このトピックの をご参照ください。

使用上の注意

  • 同じ値は同じランク値になりますが、 RANK とは異なり、シーケンスにギャップは生じません。

テーブルとデータを作成します。

-- Create table and load data.
create or replace table corn_production (farmer_ID INTEGER, state varchar, bushels_produced float);
insert into corn_production (farmer_ID, state, bushels_produced) values 
    (1, 'Iowa', 100),
    (2, 'Iowa', 110),
    (3, 'Kansas', 120),
    (4, 'Kansas', 130);

農家のトウモロコシ生産量を降順で表示し、個々の農家の生産高のランクを表示します(最高 = 1)。

SELECT state, bushels_produced, DENSE_RANK() OVER (ORDER BY bushels_produced DESC)
    FROM corn_production;
+--------+------------------+----------------------------------------------------+
| STATE  | BUSHELS_PRODUCED | DENSE_RANK() OVER (ORDER BY BUSHELS_PRODUCED DESC) |
|--------+------------------+----------------------------------------------------|
| Kansas |              130 |                                                  1 |
| Kansas |              120 |                                                  2 |
| Iowa   |              110 |                                                  3 |
| Iowa   |              100 |                                                  4 |
+--------+------------------+----------------------------------------------------+

各州内で、農家のトウモロコシ生産量を降順で示し、個々の農家の生産量のランクを表示します(最高 = 1)。

SELECT state, bushels_produced, DENSE_RANK()
      OVER (PARTITION BY state ORDER BY bushels_produced DESC)
      FROM corn_production;
+--------+------------------+----------------------------------------------------------------+
| STATE  | BUSHELS_PRODUCED |                                                   DENSE_RANK() |
|        |                  |       OVER (PARTITION BY STATE ORDER BY BUSHELS_PRODUCED DESC) |
|--------+------------------+----------------------------------------------------------------|
| Iowa   |              110 |                                                              1 |
| Iowa   |              100 |                                                              2 |
| Kansas |              130 |                                                              1 |
| Kansas |              120 |                                                              2 |
+--------+------------------+----------------------------------------------------------------+

以下のクエリと出力は、同じ値の処理方法を示しています。ランクは 12334 になります。RANK()関数からの出力とは異なり、ランク 3 に同じ値があったため、ランク 4 はスキップされません。

SELECT state, bushels_produced, DENSE_RANK()
      OVER (ORDER BY bushels_produced DESC)
      FROM corn_production;
+--------+------------------+---------------------------------------------+
| STATE  | BUSHELS_PRODUCED |                                DENSE_RANK() |
|        |                  |       OVER (ORDER BY BUSHELS_PRODUCED DESC) |
|--------+------------------+---------------------------------------------|
| Kansas |              130 |                                           1 |
| Kansas |              120 |                                           2 |
| Iowa   |              110 |                                           3 |
| Iowa   |              110 |                                           3 |
| Iowa   |              100 |                                           4 |
+--------+------------------+---------------------------------------------+