ホームページ >データベース >mysql チュートリアル >大規模な SQL データベース テーブルから最大値と対応するデータを効率的に取得するにはどうすればよいですか?
大規模な SQL テーブル内の最大値と関連データを効率的に検索する
多くの場合、データベース クエリでは、列内の最大値を見つけて、同じ行内の他の列から対応するデータを取得する必要があります。 これは、非常に大規模なデータセットの場合に特に困難です。 各一意の ID とそれに関連付けられたタグの最大のバージョン番号を検索する必要があるテーブルを考えてみましょう:
サンプルテーブル:
<code>ID | tag | version -----+-----+----- 1 | A | 10 2 | A | 20 3 | B | 99 4 | C | 30 5 | F | 40</code>
望ましい結果:
<code>ID | tag | version -----+-----+----- 2 | A | 20 3 | B | 99 4 | C | 30 5 | F | 40</code>
約 2,800 万行のテーブルの場合、ネストされた SELECT
ステートメントや GROUP BY
を使用した単純な MAX
などの標準メソッドは非常に遅くなる可能性があります。 より効率的なソリューションは、ROW_NUMBER()
ウィンドウ関数を使用します。
<code class="language-sql">SELECT s.id, s.tag, s.version FROM ( SELECT t.*, ROW_NUMBER() OVER(PARTITION BY t.id ORDER BY t.version DESC) AS rnk FROM YourTable t ) s WHERE s.rnk = 1;</code>
このクエリは 2 つのステップで機能します:
内部クエリ: 各 rnk
パーティション (同じ ID を持つ行のグループ) 内の各行に一意のランク (ID
) を割り当てます。ランキングは version
列に基づいて降順に決定されます。つまり、最高のバージョンがランク 1 になります。
外部クエリ: 内部クエリの結果をフィルターし、rnk = 1
の行のみを選択します。 これにより、各 version
の最大 ID
を持つ行が効果的に得られます。
このアプローチでは、ネストされたクエリと GROUP BY
操作が回避され、大規模なデータセットの処理が大幅に高速化されます。 ROW_NUMBER()
を使用すると、目的の結果を達成するためのクリーンで効率的な方法が提供されます。
以上が大規模な SQL データベース テーブルから最大値と対応するデータを効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。