Oracle에서 KEEP이 있는 경우와 없는 경우의 PARTITION BY
소개
Oracle에서는 PARTITION BY 절은 집계 계산을 수행하기 위해 데이터 집합을 하위 집합으로 나누는 데 사용됩니다. KEEP 절은 각 파티션에서 유지할 행을 지정합니다. 이 기사에서는 KEEP이 있는 경우와 없는 경우의 PARTITION BY 사용 간의 차이점을 설명합니다.
KEEP이 있는 쿼리와 없는 쿼리
다음 두 쿼리를 고려하세요.
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를 사용하고, 두 번째 쿼리는 KEEP을 사용합니다. (DENSE_RANK). 두 쿼리 모두 각 부서의 최저 급여와 최고 급여를 계산합니다.
KEEP (DENSE_RANK FIRST ORDER BY sal)
두 번째 쿼리에서 KEEP (DENSE_RANK FIRST ORDER BY sal) 절은 Oracle에게 급여 기준으로 오름차순으로 정렬한 후 각 부서의 첫 번째 행만 유지하도록 지시합니다. 주문하다. DENSE_RANK 함수는 각 파티션 내의 각 행에 순위를 할당하며 첫 번째 순위는 가장 낮은 급여를 나타냅니다.
쿼리 간의 차이
두 번째 쿼리는 중복됩니다. 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) 절이 필요합니다.
위 내용은 오라클의 'PARTITION BY' 절은 'KEEP'이 있는 경우와 없는 경우 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!