SQL RANK() と ROW_NUMBER() の違い
SQL の RANK() 関数と ROW_NUMBER() 関数の違いは、開発者を混乱させることがよくあります。提供された SQL クエリ ステートメントは、最初は同じ結果を生成するように見えますが、同じ値が存在する場合は異なる実行になります。
違いを詳しく見てみましょう
RANK() 関数と ROW_NUMBER() 関数の主な違いは、同一の値をどのように処理するかです。 RANK() およびそれに対応する DENSE_RANK() 関数は、決定的な動作を示します。複数の行がパーティション化列と並べ替え列で同じ値を持つ場合、それらの行には同じランクが割り当てられます。
対照的に、ROW_NUMBER() は同じ値の行であっても増加する結果値を割り当てます。この動作は非決定的であり、結果セット内の同一の行の順序が任意に変更される可能性があることを意味します。
説明例
次のシナリオを考えてみましょう。すべての行が同じ StyleID を共有し、パーティションを形成します。このパーティション内では、ID で並べ替えると、最初の 3 行は同等になります。
<code class="language-sql">WITH T(StyleID, ID) AS (SELECT 1,1 UNION ALL SELECT 1,1 UNION ALL SELECT 1,1 UNION ALL SELECT 1,2) SELECT *, RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS [RANK], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS [ROW_NUMBER], DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS [DENSE_RANK] FROM T</code>
結果の出力は次のとおりです:
<code>StyleID ID RANK ROW_NUMBER DENSE_RANK ----------- -------- --------- --------------- ---------- 1 1 1 1 1 1 1 1 2 1 1 1 1 3 1 1 2 4 4 2</code>
ご覧のとおり、ROW_NUMBER() は同一の行に数値を段階的に割り当てますが、RANK() と DENSE_RANK() は 3 つの同一の行すべてに同じランクを割り当てます。 DENSE_RANK() は RANK() と同様に動作しますが、ランキング シーケンスのギャップを避けるために、次の異なる値 2 を後続の行に割り当てます。
以上がSQL RANK() と ROW_NUMBER(): 結合された行を処理する場合の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。