問題:
RANK
によって生成されたランキングを比較したい およびDENSE_RANK
それらを新しい列としてテーブルに追加します。
例:
データベースには、sales_assistant
次の列にデータがあります:id
(主キー)、first_name
、last_name
、month
、およびsold products
。
id | first_name | last_name | 月 | 販売商品 |
---|---|---|---|---|
1 | リサ | 黒 | 5 | 2300 |
2 | メアリー | ジェイコブス | 5 | 2400 |
3 | リサ | 黒 | 6 | 2700 |
4 | メアリー | ジェイコブス | 6 | 2700 |
5 | アレックス | スミス | 6 | 2900 |
6 | メアリー | ジェイコブス | 7 | 1200 |
7 | リサ | 黒 | 7 | 1200 |
8 | アレックス | スミス | 7 | 1000 |
各セールスアシスタントの名前と名前、および販売された製品の数を表示してみましょう。また、販売された製品の数の降順でランク付けしたいと思います。
ソリューション1:
SELECT RANK() OVER(ORDER BY sold products DESC) AS r, DENSE_RANK() OVER(ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold products FROM sales_assistant;
このクエリは2つのランキングを返します。1つはRANK
によって生成されたものです。 もう1つはDENSE_RANK
によるものです 。違いは何ですか?
簡単に言えば、RANK
同じランク番号のレコードの後の位置の数をスキップします。ランキングRANK_DENSE
同じランク番号のレコードをスキップしないため、1から6までの位置番号を返します:
r | dr | first_name | last_name | 月 | 販売商品 |
---|---|---|---|---|---|
1 | 1 | アレックス | スミス | 6 | 2900 |
2 | 2 | リサ | 黒 | 6 | 2700 |
2 | 2 | メアリー | ジェイコブス | 6 | 2700 |
4 | 3 | メアリー | ジェイコブス | 5 | 2400 |
5 | 4 | リサ | 黒 | 5 | 2300 |
6 | 5 | メアリー | ジェイコブス | 7 | 1200 |
6 | 5 | リサ | 黒 | 7 | 1200 |
8 | 6 | アレックス | スミス | 7 | 1000 |
ディスカッション:
結果セットの行をランク付けする場合、SQLはRANK()
を提供します およびDENSE_RANK
関数。これらの関数はSELECT
で使用されます 他の列と。 RANK
の後 またはDENSE_RANK
、OVER()
を呼び出します ORDER BY
を受け取る関数 ランキングを割り当てる前に並べ替える列の名前を含む句。
DENSE_RANK
とは異なり 、RANK
等しいランキングの後の位置をスキップします。スキップされる位置の数は、同じランクの行の数によって異なります。たとえば、メアリーとリサは同じ数の製品を販売し、どちらも2位にランクされています。 RANK
を使用 、次の位置は#4です。 DENSE_RANK
を使用 、次の位置は#3です。
両方のRANK
およびRANK_DENSE
データのパーティションでの作業:
ソリューション1:
SELECT RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS r, DENSE_RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold products FROM sales_assistant;
特定の列(この例では、month
)に従ってレコードをグループに分割できます。 )。この状況では、レコードはパーティションの一部としてランク付けされます:
r | dr | first_name | last_name | 月 | 販売商品 |
---|---|---|---|---|---|
1 | 1 | メアリー | ジェイコブス | 5 | 2400 |
2 | 2 | リサ | 黒 | 5 | 2300 |
1 | 1 | アレックス | スミス | 6 | 2900 |
2 | 2 | リサ | 黒 | 6 | 2700 |
2 | 2 | メアリー | ジェイコブス | 6 | 2700 |
1 | 1 | メアリー | ジェイコブス | 7 | 1200 |
1 | 1 | リサ | 黒 | 7 | 1200 |
3 | 2 | アレックス | スミス | 7 | 1000 |