ホームページ >データベース >mysql チュートリアル >SQL でグループごとに最高値または最低値を持つレコードを効率的に取得するにはどうすればよいですか?

SQL でグループごとに最高値または最低値を持つレコードを効率的に取得するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-11 17:57:16825ブラウズ

How to Efficiently Retrieve Records with the Highest or Lowest Values per Group in SQL?

グループごとの最大/最小値を持つレコードの取得

問題:

レコードの取得各フィールド内の指定されたフィールドの最大値または最小値group.

以前に提案されたソリューション:

サブクエリを含む複雑なクエリでのランク (@rank := @rank 1) の使用。

代替解決策:

より効率的なアプローチは、ランキング変数を使用しない左外部結合:

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId AND t1.OrderField < t2.OrderField
WHERE t2.GroupId IS NULL
ORDER BY t1.OrderField;

このクエリは、(GroupId, OrderField) のインデックス付け戦略を利用して t2 へのアクセスを最適化することで、望ましい結果を達成します。

最適化考慮事項:

  • インデックス作成: 最適なパフォーマンスを得るには、(GroupId、OrderField) に複合インデックスを作成することが重要です。
  • 複数最高値/最小値: 複数のレコードが同じ最高値/最小値を持つ場合を処理します。グループ内の値を指定するには、次のように条件を拡張します:
AND (t1.OrderField < t2.OrderField 
     OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id))

左外部結合アプローチの利点:

  • ランキングやサブクエリを使用し、潜在的なパフォーマンスの問題を排除します。
  • 最適化が向上し、クエリ オプティマイザーがインデックスを使用できるようになります。
  • ランクベースのメソッドと比較して実行が高速です。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。