ホームページ >データベース >mysql チュートリアル >ウィンドウ関数を使用して Oracle SQL で最大ベースの値を効率的に選択するにはどうすればよいですか?

ウィンドウ関数を使用して Oracle SQL で最大ベースの値を効率的に選択するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-17 19:17:09543ブラウズ

How Can I Efficiently Select Maximum-Based Values in Oracle SQL Using Window Functions?

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

仕組み

  1. OVER (PARTITION BY key ORDER BY num DESC) 句は、KEY 列でデータを分割し、NUM 列で各パーティションを降順に並べます。
  2. ROW_NUMBER() は、そのパーティション内の各行に一意のランクを割り当てます。 NUM 値が最も高い行にはランク 1 が与えられます。
  3. 外側の WHERE 句は結果をフィルタリングし、seqnum = 1 を含む行のみを保持し、各 NUM の最大 KEY 値を効果的に選択します。

主な違い

重要な点: 他の方法とは異なり、ウィンドウ関数のアプローチでは、複数の行が同じ最大 KEY 値を共有している場合でも、NUM ごとに 1 つの行が保証されます。 この動作は、そのような場合に複数の行を返す他の手法とは異なる場合があります。 この区別が重要でない場合は、ウィンドウ関数がその明瞭さと効率の点で優れたソリューションを提供します。

以上がウィンドウ関数を使用して Oracle SQL で最大ベースの値を効率的に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。