ホームページ > データベース > mysql チュートリアル > 「KEEP」句はOracle集計クエリの「PARTITION BY」にどのような影響を与えますか?

「KEEP」句はOracle集計クエリの「PARTITION BY」にどのような影響を与えますか?

Mary-Kate Olsen
リリース: 2025-01-05 04:06:44
オリジナル
234 人が閲覧しました

How Does the `KEEP` Clause Affect `PARTITION BY` in Oracle Aggregate Queries?

Oracle での KEEP ありとなしの PARTITION BY

Oracle では、PARTITION BY 句を使用して、目的に応じてデータを個別のグループに分割できます。集計関数の適用について説明します。多くの場合、パフォーマンスの最適化や論理グループ化のためにデータをパーティション化すると有益です。

PARTITION BY 句は、KEEP キーワードの有無にかかわらず使用できます。 KEEP が使用されない場合、パーティション全体が集約に使用されます。一方、KEEP を使用すると、特定の条件を満たす行のみが集計用に保持されます。

違いを説明するために、次の 2 つのクエリを考えてみましょう。

KEEP を使用しないクエリ 1 :

SELECT deptno, MIN(sal) OVER (PARTITION BY deptno) AS "Lowest", MAX(sal) OVER (PARTITION BY deptno) AS "Highest"
FROM empl
ログイン後にコピー

クエリ 2 KEEP:

SELECT deptno, MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest", MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS "Highest"
FROM empl
ログイン後にコピー

クエリ 2 は、KEEP 句を利用して、各部門の最初と最後にランク付けされた給与のみを返します (DENSE_RANK 関数を使用)。全体的な効果は、重複する値を排除し、明確な最低給与と最高給与を提供することです。

さらに詳しく説明すると、

  • OVER (PARTITION BY deptno): パーティションを分割します。 deptno 列に基づくデータ。
  • ORDER BY sal: 各パーティション内の行を給与で昇順に並べ替えます。
  • KEEP (DENSE_RANK FIRST): 各パーティションの最初にランク付けされた行のみを保持します。 DENSE_RANK 関数は、同じ値が同じランクを共有するように、行に一意の連続ランクを割り当てます。
  • MIN(sal): 各パーティション内で保持される行の最低給与を計算します。
  • MAX(sal): 各行内に保持される行の最大給与を計算します。

2 番目のクエリでは、MIN と DENSE_RANK FIRST が sal 列に適用され、結果は同じ動作になります。したがって、このシナリオでは KEEP 句は冗長です。ただし、名前などの最小値の計算に別の列が使用された場合は、KEEP 句が関連します。

例:

MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno)
ログイン後にコピー

このクエリは、次のクエリに対応する名前を返します。同じ最低給与に関連付けられた重複した名前を除いた、各部門の最低給与。

以上が「KEEP」句はOracle集計クエリの「PARTITION BY」にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート