Oracle SQL での各 KEY の最高の VAL の抽出
このガイドでは、Oracle SQL を使用して、グループ化されたデータ内の各 VAL
の最大 KEY
を効率的に取得する方法を説明します。 一般的なシナリオを調べてみましょう:
TABLE_NAME
という名前のテーブルには次のデータが含まれています:
KEY | NUM | VAL |
---|---|---|
A | 1 | AB |
B | 1 | CD |
B | 2 | EF |
C | 2 | GH |
C | 3 | HI |
D | 1 | JK |
D | 3 | LM |
目標は、一意の各 VAL
の最大 KEY
のみを示す結果セットを生成することです:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
効率的な Oracle SQL ソリューション (10g 以降):
サブクエリでもこれを実現できますが、よりエレガントで多くの場合高速なソリューションでは、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>
このクエリは、まず、各 seqnum
パーティション内の各行に、KEY
の降順でランク (NUM
) を割り当てます。 次に、seqnum = 1
を含む行のみを含むように結果をフィルタリングし、最も高い NUM
を含む行を効果的に選択します (したがって、暗黙的に、各行内の VAL
と NUM
の間に一貫した関係があると仮定して、最も高い VAL
が選択されます)キー)。
重要な注意事項: このメソッドでは、KEY
ごとに 1 行が保証されます。 NUM
内の潜在的な関係を別の方法で処理する必要がある場合 (たとえば、複数の行が最大の KEY
を共有する場合に NUM
に対して複数の行を返す)、RANK()
の代わりに DENSE_RANK()
または ROW_NUMBER()
を使用することを検討してください。
以上がOracle SQLを使用してグループ化されたデータ内の各キーの最大VALをフェッチするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。