ホームページ > データベース > mysql チュートリアル > SQL RANK() と ROW_NUMBER(): 各関数をいつ使用する必要があるか?

SQL RANK() と ROW_NUMBER(): 各関数をいつ使用する必要があるか?

DDD
リリース: 2025-01-13 16:46:43
オリジナル
916 人が閲覧しました

SQL RANK() vs. ROW_NUMBER(): When Should You Use Each Function?

SQL の RANK() 関数と ROW_NUMBER() 関数についての深い理解

SQL の RANK() 関数と ROW_NUMBER() 関数は混同しやすいため、この記事は 2 つの違いを明確にすることを目的としています。

まず、パーティションに重複する値がない場合、これら 2 つの関数の SQL クエリ結果はまったく同じになることに注意してください。ただし、重複する値が表示されると、違いが明らかになります。

重複した値と確実性

ROW_NUMBER() 関数は、ソート列の行の値が同じであっても、パーティション内の各行に一意の増分値を割り当てます。これは、ROW_NUMBER() が非決定的であり、割り当てられる値がクエリごとに任意に変更される可能性があることを意味します。

対照的に、RANK() と DENSE_RANK() は両方ともパーティション内で決定的です。ソート列とパーティショニング列の両方に同じ値がある場合、複数の行には同じランク値が割り当てられます。

次の例を考えてみましょう:

<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>
ログイン後にコピー

この例では、同じパーティション内で ID (StyleID) でソートすると、最初の 3 行が重複します。各関数がこれらの重複値をどのように処理するかは次のとおりです:

  • ROW_NUMBER() は増加する値 (1、2、3) を割り当て、重複する値を無視します。
  • RANK() は、3 つの重複行すべてに同じランク値 (1) を割り当て、次に異なる値の 4 にジャンプします。
  • DENSE_RANK() も重複する行に同じランク値 (1) を割り当てますが、次の異なる値では 2 に増分されます。

結論

RANK() と DENSE_RANK() は、重複した値が存在する場合でも、パーティション内で一貫したランキングを維持します。ただし、ROW_NUMBER() は任意に増加する値を割り当てるため、予測できない結果が生じる可能性があります。これらの違いを理解すると、特定の SQL ニーズに基づいて適切な関数を選択するのに役立ちます。

以上がSQL RANK() と ROW_NUMBER(): 各関数をいつ使用する必要があるか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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