ホームページ > データベース > mysql チュートリアル > SQL RANK() と ROW_NUMBER(): 結合された行を処理する場合の違いは何ですか?

SQL RANK() と ROW_NUMBER(): 結合された行を処理する場合の違いは何ですか?

Patricia Arquette
リリース: 2025-01-13 17:01:42
オリジナル
823 人が閲覧しました

SQL RANK() vs. ROW_NUMBER(): How Do They Differ When Handling Tied Rows?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート