ホームページ >データベース >mysql チュートリアル >単一の SQL テーブル内のグループごとの最大値を効率的に取得するにはどうすればよいですか?
グループごとの最大値取得のための SQL クエリの最適化
大規模な SQL テーブルを操作する場合、効率的なデータ取得が最も重要です。 頻繁に行われるタスクには、特定の行グループ内の最大値を特定することが含まれます。 この記事では、複数のテーブル スキャンを回避し、これを効率的に達成するための最適化された SQL クエリを示します。
SCORES
、ID
、および 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 サイトの他の関連記事を参照してください。