ホームページ > データベース > mysql チュートリアル > 単一の SQL テーブル内のグループごとの最大値を効率的に取得するにはどうすればよいですか?

単一の SQL テーブル内のグループごとの最大値を効率的に取得するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-21 07:56:14
オリジナル
869 人が閲覧しました

How Can I Efficiently Retrieve the Maximum Value per Group in a Single SQL Table?

グループごとの最大値取得のための SQL クエリの最適化

大規模な SQL テーブルを操作する場合、効率的なデータ取得が最も重要です。 頻繁に行われるタスクには、特定の行グループ内の最大値を特定することが含まれます。 この記事では、複数のテーブル スキャンを回避し、これを効率的に達成するための最適化された SQL クエリを示します。

SCORESID、および ROUND 列を持つ SCORE テーブルを考えてみましょう。目的は、各 ROUND とそれに対応する ID の最大 SCORE を取得することです。 反復処理を伴う非効率的な方法は、大規模なデータセットには適していません。

次のクエリは、最適なパフォーマンスを得るためにウィンドウ関数と DISTINCT を使用します。

<code class="language-sql">SELECT DISTINCT
       id
      ,max(round) OVER (PARTITION BY id) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;</code>
ログイン後にコピー

このアプローチでは、ウィンドウ関数を使用して、最大の ROUND と各 SCORE グループ内の対応する ID を計算します。次に、DISTINCT 句は重複する行を削除し、ROUND ごとに最も高い ID のみが返されるようにします。これにより、複数のテーブル スキャンに比べて処理時間が大幅に短縮されます。

同様に効果的な別の方法では、FIRST_VALUE を 2 回使用します。

<code class="language-sql">SELECT DISTINCT
       id
      ,first_value(round) OVER (PARTITION BY id ORDER BY round DESC) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;</code>
ログイン後にコピー

どちらのクエリでも同じ結果が得られます:

ID ROUND SCORE
1 3 2
2 2 12
3 1 6

これらの最適化されたクエリは、1 回のテーブル スキャンでグループごとの最大値を取得することにより、効率の悪い方法に比べてパフォーマンスが大幅に向上します。 これは、大規模なデータセットを扱う際の応答性を維持するために非常に重要です。

以上が単一の SQL テーブル内のグループごとの最大値を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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