DENSE_RANK ウィンドウ関数
DENSE_RANK ウィンドウ関数は、OVER 句の ORDER BY 式に基づいて、値のグループの値のランクを特定します。オプションの PARTITION BY 句がある場合、ランク付けは行のグループごとにリセットされます。ランク付け条件が同じ値の行は、同じランクを受け取ります。DENSE_RANK 関数は、2 行以上で同点となった場合、ランク付けされた値の順位に差はないことが、RANK とは異なります。例えば、2 行が 1
位にランク付けされると、次のランクは 2
位になります。
同じクエリに PARTITION BY および ORDER BY 句のあるランク付け関数を使用することができます。
構文
DENSE_RANK() OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list ] )
引数
- ( )
-
この関数は引数を受け取りませんが、空のかっこは必要です。
- OVER
-
DENSE_RANK 関数のウィンドウ句。
- PARTITION BY expr_list
-
(オプション) ウィンドウを定義する 1 つ以上の式。
- ORDER BY order_list
-
(オプション) ランク付けの値が基とする式。PARTITION BY が指定されていない場合、ORDER BY はテーブル全体を使用します。ORDER BY を省略した場合、すべての行について戻り値は
1
です。ORDER BY で一意の並べ替えが行われない場合、行の順序は不確定になります。詳細については、「ウィンドウ関数用データの一意の並び順」を参照してください。
戻り型
INTEGER
例
次の例では、ウィンドウ関数のサンプルテーブルを使用しています。詳細については、「ウィンドウ関数例のサンプルテーブル」を参照してください。
次の例では、販売数量によってテーブルを順序付けして、各行にデンス値のランクと標準のランクの両方を割り当てます。結果はウィンドウ関数の結果が提供された後にソートされます。
SELECT salesid, qty,
DENSE_RANK() OVER(ORDER BY qty DESC) AS d_rnk,
RANK() OVER(ORDER BY qty DESC) AS rnk
FROM winsales
ORDER BY 2,1;
+---------+-----+-------+-----+
| salesid | qty | d_rnk | rnk |
+---------+-----+-------+-----+
| 10001 | 10 | 5 | 8 |
| 10006 | 10 | 5 | 8 |
| 30001 | 10 | 5 | 8 |
| 40005 | 10 | 5 | 8 |
| 30003 | 15 | 4 | 7 |
| 20001 | 20 | 3 | 4 |
| 20002 | 20 | 3 | 4 |
| 30004 | 20 | 3 | 4 |
| 10005 | 30 | 2 | 2 |
| 30007 | 30 | 2 | 2 |
| 40001 | 40 | 1 | 1 |
+---------+-----+-------+-----+
DENSE_RANK および RANK 関数が同じクエリで並べて使用される場合、同じ行のセットに割り当てるランク付けの違いに注意してください。
sellerid によってテーブルをパーティション分割し、数量によって各パーティションを順序付けして、行ごとにデンス値のランクを割り当てるには、次の例を使用します。結果はウィンドウ関数の結果が提供された後にソートされます。
SELECT salesid, sellerid, qty,
DENSE_RANK() OVER(PARTITION BY sellerid ORDER BY qty DESC) AS d_rnk
FROM winsales
ORDER BY 2,3,1;
+---------+----------+-----+-------+
| salesid | sellerid | qty | d_rnk |
+---------+----------+-----+-------+
| 10001 | 1 | 10 | 2 |
| 10006 | 1 | 10 | 2 |
| 10005 | 1 | 30 | 1 |
| 20001 | 2 | 20 | 1 |
| 20002 | 2 | 20 | 1 |
| 30001 | 3 | 10 | 4 |
| 30003 | 3 | 15 | 3 |
| 30004 | 3 | 20 | 2 |
| 30007 | 3 | 30 | 1 |
| 40005 | 4 | 10 | 2 |
| 40001 | 4 | 40 | 1 |
+---------+----------+-----+-------+
最後の例を正しく使用するには、次のコマンドを使用して WINSALES テーブルに行を挿入します。この行には、別の行と同じ buyerid、sellerid、および qtysold があります。これにより、前の例では 2 つの行が同数になり、DENSE_RANK 関数と RANK 関数の違いが示されます。
INSERT INTO winsales VALUES(30009, '2/2/2003', 3, 'b', 20, NULL);
buyerid と sellerid によってテーブルをパーティション分割し、数量によって各パーティションを順序付けして、行ごとにデンス値のランクと標準のランクの両方を割り当てるには、次の例を使用します。結果はウィンドウ関数が適用された後にソートされます。
SELECT salesid, sellerid, qty, buyerid,
DENSE_RANK() OVER(PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS d_rnk,
RANK() OVER (PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS rnk
FROM winsales
ORDER BY rnk;
+---------+----------+-----+---------+-------+-----+
| salesid | sellerid | qty | buyerid | d_rnk | rnk |
+---------+----------+-----+---------+-------+-----+
| 20001 | 2 | 20 | b | 1 | 1 |
| 30007 | 3 | 30 | c | 1 | 1 |
| 10006 | 1 | 10 | c | 1 | 1 |
| 10005 | 1 | 30 | a | 1 | 1 |
| 20002 | 2 | 20 | c | 1 | 1 |
| 30009 | 3 | 20 | b | 1 | 1 |
| 40001 | 4 | 40 | a | 1 | 1 |
| 30004 | 3 | 20 | b | 1 | 1 |
| 10001 | 1 | 10 | c | 1 | 1 |
| 40005 | 4 | 10 | a | 2 | 2 |
| 30003 | 3 | 15 | b | 2 | 3 |
| 30001 | 3 | 10 | b | 3 | 4 |
+---------+----------+-----+---------+-------+-----+