sql >> データベース >  >> RDS >> Database

SQLのRANKとDENSE_RANKの違いは何ですか?

    問題:

    RANKによって生成されたランキングを比較したい およびDENSE_RANK それらを新しい列としてテーブルに追加します。

    例:

    データベースには、sales_assistant 次の列にデータがあります:id (主キー)、first_namelast_namemonth 、および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_RANKOVER()を呼び出します 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

    1. SQLServerの列で数値以外の値を検索する

    2. オプションを使用してコマンドラインから.sqlファイルをエクスポートおよびインポートする方法は?

    3. BLOB列のテキストを置き換える

    4. SQLite Random()のしくみ