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 サイトの他の関連記事を参照してください。