Oracle SQL: グループ内の最大列値にリンクされた値の抽出
一般的なデータベース タスクには、特にグループ化されたデータを扱う場合に、列の最大値に関連付けられた値を選択することが含まれます。 KEY
、NUM
、VAL
:
KEY | NUM | VAL |
---|---|---|
A | 1 | AB |
B | 1 | CD |
B | 2 | EF |
C | 2 | GH |
C | 3 | HI |
D | 1 | JK |
D | 3 | LM |
目的は、各 NUM
とそれに対応する KEY
の最大 VAL
を見つけることです。目的の出力:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
1 つのメソッドはサブクエリを使用します。
<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>
ただし、より効率的で読みやすいアプローチでは、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>
これにより、KEY
値の降順に基づいて、各 NUM
グループ内のランクが割り当てられます。 次に、WHERE
句で上位ランク (seqnum = 1
) をフィルタリングし、目的の結果を生成します。
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
どちらの方法でも同じ結果が得られますが、一般に、ROW_NUMBER()
アプローチの方が、特に大規模なデータセットの場合に優れたパフォーマンスと明瞭さが得られます。 最適な選択は特定のニーズや好みによって異なりますが、ROW_NUMBER()
は、この一般的な SQL の問題に対して堅牢で洗練されたソリューションを提供します。
以上がOracle SQLのグループ内の最大列値に関連付けられた値を効率的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。