ホームページ >データベース >mysql チュートリアル >ウィンドウ関数を使用して Oracle SQL で最大ベースの値を効率的に選択するにはどうすればよいですか?
Oracle SQL: ウィンドウ関数を使用した最大値の抽出
Oracle 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 |
ウィンドウ関数のソリューション
最適なソリューションは 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 | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
仕組み
OVER (PARTITION BY key ORDER BY num DESC)
句は、KEY
列でデータを分割し、NUM
列で各パーティションを降順に並べます。ROW_NUMBER()
は、そのパーティション内の各行に一意のランクを割り当てます。 NUM
値が最も高い行にはランク 1 が与えられます。WHERE
句は結果をフィルタリングし、seqnum = 1
を含む行のみを保持し、各 NUM
の最大 KEY
値を効果的に選択します。主な違い
重要な点: 他の方法とは異なり、ウィンドウ関数のアプローチでは、複数の行が同じ最大 KEY
値を共有している場合でも、NUM
ごとに 1 つの行が保証されます。 この動作は、そのような場合に複数の行を返す他の手法とは異なる場合があります。 この区別が重要でない場合は、ウィンドウ関数がその明瞭さと効率の点で優れたソリューションを提供します。
以上がウィンドウ関数を使用して Oracle SQL で最大ベースの値を効率的に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。