ホームページ > データベース > mysql チュートリアル > ランキング関数を使用せずに SQL でグループごとの最小値と最大値を効率的に見つけるにはどうすればよいですか?

ランキング関数を使用せずに SQL でグループごとの最小値と最大値を効率的に見つけるにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-23 22:32:17
オリジナル
738 人が閲覧しました

How to Efficiently Find Minimum and Maximum Values per Group in SQL Without Using Ranking Functions?

グループごとの最大値と最小値の取得

概要

このチュートリアルでは、グループの最大値または最小値を持つレコードを取得する方法について説明します。ランキング (@Rank) に依存せずに、各グループ内の指定されたフィールド。この最初の質問では解決策として @Rank が使用されていましたが、その後の回答では結合を使用したより効率的なアプローチが示されています。

解決策

各グループの最も高い OrderField を持つ行を取得するには、左外部メソッドを使用します。 join と次のクエリ:

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

グループ内で複数のレコードに同じ OrderField があり、そのうちの 1 つが必要な場合は、条件を拡張できます。

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId 
        AND (t1.OrderField < t2.OrderField 
         OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id))
WHERE t2.GroupId IS NULL
ログイン後にコピー

この洗練されたクエリにより、同じグループ GroupId 内に、より高い OrderField 値、またはより低い Id 値を持つ等しい OrderField を持つ他の行 t2 が存在しない場合にのみ、t1 が返されることが保証されます。したがって、各グループ内で最大の OrderField を持つ行を効果的に取得します。

最適化

左外部結合アプローチを使用すると、@Rank とサブクエリを含む以前の方法と比較して、クエリのパフォーマンスを大幅に向上させることができます。左外部結合は、アクセスを最適化するために (GroupId、OrderField) のインデックスを利用できます。

@Rank に関する注意

@Rank を使用した最初のアプローチは、次のような事実により期待どおりに機能しない可能性があります。 @Rank の増分は、最初のテーブルが処理された後も続行されます。テーブル間で @Rank を 0 にリセットするには、追加の派生テーブルを導入する必要がありますが、これにより最適化が不十分になる可能性があります。

以上がランキング関数を使用せずに SQL でグループごとの最小値と最大値を効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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