HOME >> Tips >> Microsoft SQL Server

集計関数(RANK,DENSE_RANK,ROW_NUMBER)の結果の違い

2017/4/13
文書番号:20727

SQL Server でも集計関数を使用して順位などの情報を取得することができます。

集計関数には似たような関数(RANK,DENSE_RANK,ROW_NUMBER)があります。
これらの関数の結果の違いを確認します。


テスト用のテーブルとして以下のようなテーブルとデータを準備します。

【操作方法】

  1. 次のコマンドを実行します。
    
    SELECT code
          ,value
          ,RANK() over(order by value)       AS 'RANK'
          ,DENSE_RANK() over(order by value) AS 'DENSE_RANK'
          ,ROW_NUMBER() over(order by value) AS 'RANK'
    FROM   Table_1
    ORDER BY value
    
    RANK() over(order by ~)の order by で指定した順にソートした際の順位を返します。

    RANK 同率があった場合順位は同じになり、その次は順位を飛ばします。
    (1位、1位、3位・・・)
    DENSE_RANK 同率があった場合順位は同じになり、その次は順位を飛ばしません。
    (1位、1位、2位・・・)
    ROW_NUMBER 同率があっても同じ順位にはならず、順位をカウントします。
    同率があった場合の順位は常に同じとは限りません。

    クリックで拡大
  2. ソート条件が複数ある場合はカンマ区切りで複数指定できます。
    ROW_NUMBER を使用するときは同率が発生しないようにorder by を指定します。

    クリックで拡大
  3. ソート条件の指定は降順で指定することもできます。

    クリックで拡大
  4. まとまり(分類とか区分とか)ごとの順位をとってみます。
    「class」という列を追加しました。

    クリックで拡大
  5. RANK() over(partition by ~ で指定した列の値ごとに順位をとることができます。

    クリックで拡大