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 サイトの他の関連記事を参照してください。