ホームページ > データベース > mysql チュートリアル > Oracle の「PARTITION BY」句は、「KEEP」がある場合とない場合でどのように異なりますか?

Oracle の「PARTITION BY」句は、「KEEP」がある場合とない場合でどのように異なりますか?

Susan Sarandon
リリース: 2024-12-21 00:45:10
オリジナル
661 人が閲覧しました

How Does Oracle's `PARTITION BY` Clause Differ with and without `KEEP`?

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

概要

Oracle の PARTITION BY 句は、集計計算を実行するためにデータのセットをサブセットに分割するために使用されます。 KEEP 句は、各パーティションからどの行を保持するかを指定します。この記事では、KEEP ありとなしの PARTITION BY の使用の違いについて説明します。

KEEP ありとなしのクエリ

次の 2 つのクエリについて考えてみましょう:

SELECT
    empno,
    deptno,
    sal,
    MIN(sal) OVER (PARTITION BY deptno) AS "Lowest",
    MAX(sal) OVER (PARTITION BY deptno) AS "Highest"
FROM
    empl;

SELECT
    empno,
    deptno,
    sal,
    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;
ログイン後にコピー

最初のクエリは KEEP なしで PARTITION BY を使用し、2 番目のクエリは KEEP を使用します(DENSE_RANK)。どちらのクエリも、各部門の最低給与と最高給与を計算します。

KEEP (DENSE_RANK FIRST ORDER BY sal)

2 番目のクエリでは、KEEP (DENSE_RANK FIRST ORDER BY) sal) 句は、データをソートした後、各部門の最初の行のみを保持するように Oracle に指示します。給与の昇順で行を表示します。 DENSE_RANK 関数は、各パーティション内の各行にランクを割り当てます。最初のランクは最低給与を示します。

クエリ間の違い

2 番目のクエリは冗長です。 MIN と DENSE_RANK FIRST は両方とも同じ sal 列で動作します。これらは、KEEP を使用せずに最低給与を直接計算する最初のクエリと同じ結果を生成します。

これは、KEEP (DENSE_RANK FIRST ORDER BY sal) 句が MIN または MAX 集計が有効な場合にのみ役立つためです。順序付け列とは別の列で実行されます。このような場合、KEEP 句を使用すると、計算にどの行を含めるかをより具体的に制御できます。

次のクエリを考えてみましょう:

SELECT
    name,
    sal,
    deptno,
    MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest",
    MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest Employee"
FROM
    test;
ログイン後にコピー

このクエリは、各部門の最低給与と最低給与の従業員の名前を計算します。この場合、KEEP (DENSE_RANK FIRST ORDER BY sal) 句が必要です。これは、同じ最低給与の行が複数ある場合でも、最低給与と対応する従業員名のみが返されるようにするためです。

以上がOracle の「PARTITION BY」句は、「KEEP」がある場合とない場合でどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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