ランク付け関数はたとえば、ページングをアプリケーションで行う場合に指定された行番号のみ取得するなどに非常に有効かつ高速です。CTE(Common Template Expression) と同じくらい強力な機能だと思いますので、使用方法のサンプルを掲載します。
動作確認環境は SQL Server 2005 Developer Edition を使用します。
1.順位付け関数 ROW_NUMBER
指定されたパーティションごとに1から連続した数値を設定する関数です。ORDER BY で指定された値が同じでも、異なる番号が結果行に設定されます。
-- 順位付け関数を使用する -- ROW_NUMBER -- ViewCountの昇順に1から連続した数値をRNUM列にもつSELECT文 SELECT ROW_NUMBER() OVER (ORDER BY ViewCount) RNUM, * FROM dbo.Article -- CategoryIDごとに、ViewCountの昇順に1から連続した数値をRNUM列にもつSELECT文 SELECT ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY ViewCount) RNUM, * FROM dbo.Article
2. ランク付け関数RANK, DENSE_RANK
指定されたパーティションごとに1から連続した数値を設定する関数です。ORDER BY で指定された値が同じ場合、同じ値が結果行に設定されます。RANK,DENSE_RANKはORDER BY で指定された値が同じとなった、次の行の連続値の設定方法が異なります。値の設定方法はサンプルのコメントを参照してください。
-- CategoryIDごとにViewCountの昇順に1から連続した数値をもつSELECT文 -- ROW_NUMBERと異なり、ORDER BY で指定される列の値が同じ場合、同じ順位の値 -- が設定される。 -- たとえば、1,2,3,4,5,5,7のような値になる場合がある SELECT RANK() OVER (PARTITION BY CategoryID ORDER BY ViewCount) RNUM, * FROM dbo.Article -- CategoryIDごとにViewCountの昇順に1から連続した数値をもつSELECT文 -- RANKと異なり、ORDER BY で指定される列の値が同じ場合、同じ順位の値 -- が設定され、次の順位は引き続き連番が設定される。 -- たとえば、1,2,3,4,5,5,6,7のような順位の値になる場合がある SELECT DENSE_RANK() OVER (PARTITION BY CategoryID ORDER BY ViewCount) RNUM, * FROM dbo.Article
3. 順位付けをグループ分けするNTILE
指定されたパーティションごとに、NTILEでしてされた数でグループ化した番号を結果の列の設定します。
-- 順序付けられたパーティションの行を、指定した数のグループに分散します。 -- グループには、1 から始まる番号が付けられます。 -- 行ごとに、NTILE はその行が属しているグループの番号を返します。 -- サンプルでは、ViewCountごとに順位付けした結果を3つのグループ番号 -- を設定します。処理結果の順位列は1,1,1,2,2,2,3,3のようになります。 SELECT NTILE(3) OVER (ORDER BY ViewCount) RNUM, * FROM dbo.Article
4.まとめ
今回は以上です。順位付け関数はCTE(共通テーブル式)とともに便利な機能だと思うので使う機会があるのではと思います。
間違い等があればご指摘ください。
さんのコメント: さんのコメント: