問題:
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 |