ホームページ > データベース > mysql チュートリアル > グループ化を使用して SQL で最大値と関連する値を効率的に取得するにはどうすればよいですか?

グループ化を使用して SQL で最大値と関連する値を効率的に取得するにはどうすればよいですか?

DDD
リリース: 2025-01-17 19:26:10
オリジナル
1011 人が閲覧しました

How Can I Efficiently Retrieve the Maximum Value and Associated Value in SQL with Grouping?

SQL グループ化の最大値とそれに関連する値を効率的に取得するための洗練されたソリューション

SQL では、別の列の最大値を見つけて、グループ化後の 3 番目の列に基づいてそれに関連付けられた値を取得するのが難しいことがよくあります。次のシナリオを考えてみましょう:

次のフォームが利用可能です:

KEY NUM VAL
A 1 AB
B 1 CD
B 2 EF
C 2 GH
C 3 HI
D 1 JK
D 3 LM

目標は、各 KEY の最大 NUM に対応する VAL 値を見つけることです。期待される結果は次のとおりです:

KEY VAL
A AB
B EF
C HI
D LM

ただし、次のクエリを使用して目標を達成できます:

<code class="language-sql">select KEY, VAL
from TABLE_NAME TN
where NUM = (
    select max(NUM)
    from TABLE_NAME TMP
    where TMP.KEY = TN.KEY
    )</code>
ログイン後にコピー

しかし、KEY 値が多数ある場合、この方法は不器用に見えます。 ただし、 row_number() 関数を使用すると、より洗練されたソリューションが提供されます。

<code class="language-sql">select key, val
from (select t.*, row_number() over (partition by key order by num desc) as seqnum
      from table_name t
     ) t
where seqnum = 1;</code>
ログイン後にコピー

このメソッドは、パーティション分割と並べ替えの概念を利用して、望ましい結果を取得します。 row_number() のパーティションを KEY に設定し、NUM で降順に並べ替えることで、各パーティションの各行にシーケンス番号が割り当てられます。次に、シリアル番号 1 の行を選択して、各 KEY に対応する最大 NUM 値とそれに関連付けられた VAL 値を取得します。

この改良されたアプローチは、元のクエリとは若干異なる動作をすることに注意することが重要です。元のクエリでは KEY ごとに複数の行が返される場合がありますが、このソリューションでは KEY ごとに 1 行のみが返されます。元の動作を保持する必要がある場合は、dense_rank()rank() または row_number() に置き換えることができます。

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

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