Oracle RANK() 및 DENSE_RANK(): 창 기능 비교 분석
Oracle의 RANK()
및 DENSE_RANK()
은 지정된 파티션 내의 행에 순위를 할당하는 데 사용되는 창 함수입니다. 둘 다 비슷한 목표를 달성하지만 동점 및 NULL 값을 처리하는 방식은 크게 다릅니다.
RANK()
기능
RANK()
은 지정된 순서에 따라 순위를 지정합니다. 결정적으로, 동일한 행에 동일 순위를 할당한 다음 건너뛰기 순위를 지정합니다. 예를 들어, 3개의 행이 공동 2위를 차지하면 모두 2위를 받게 되며 다음 순위는 5위가 됩니다.
DENSE_RANK()
기능
RANK()
과 달리 DENSE_RANK()
은 동률이더라도 간격 없이 연속 순위를 부여합니다. 동점인 모든 행은 동일한 순위를 받으며, 후속 순위가 즉시 이어집니다. 건너뛴 순위가 없습니다.
n번째 최고 연봉 조회
emptbl
테이블에서 n번째로 높은 급여를 식별하려면 RANK()
절 내에 DENSE_RANK()
또는 OVER()
을 사용할 수 있습니다.
<code class="language-sql">SELECT empname, sal FROM ( SELECT empname, sal, RANK() OVER (ORDER BY sal DESC) AS rnk -- Note: ORDER BY sal DESC for nth highest FROM emptbl ) WHERE rnk = n;</code>
NULL 값 처리
두 함수의 NULL 값 처리는 ORDER BY
절에 의해 결정됩니다. NULLS FIRST
을 지정하면 NULL이 NULL이 아닌 값보다 먼저 순위가 지정됩니다. NULLS LAST
인 경우 그 다음으로 순위가 매겨집니다.
예시
다음 스크립트를 살펴보겠습니다.
<code class="language-sql">WITH q AS ( SELECT 10 AS DEPTNO, 'rrr' AS EMPNAME, 10000.00 AS SAL FROM DUAL UNION ALL SELECT 11, 'nnn', 20000.00 FROM DUAL UNION ALL SELECT 11, 'mmm', 5000.00 FROM DUAL UNION ALL SELECT 12, 'kkk', 30000 FROM DUAL UNION ALL SELECT 10, 'fff', 40000 FROM DUAL UNION ALL SELECT 10, 'ddd', 40000 FROM DUAL UNION ALL SELECT 10, 'bbb', 50000 FROM DUAL UNION ALL SELECT 10, 'xxx', NULL FROM DUAL UNION ALL SELECT 10, 'ccc', 50000 FROM DUAL ) SELECT EMPNAME, DEPTNO, SAL, RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL NULLS FIRST) AS R, DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL NULLS FIRST) AS DR1, DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL NULLS LAST) AS DR2 FROM q;</code>
결과는 RANK()
절의 DENSE_RANK()
또는 NULLS FIRST
사양에 따라 NULL 값을 처리할 때 NULLS LAST
과 ORDER BY
의 대조되는 동작을 명확하게 보여줍니다. 이 예는 특정 요구 사항에 적합한 순위 기능을 선택할 때 이러한 미묘한 차이를 이해하는 것이 중요함을 강조합니다.
위 내용은 Oracle의 RANK() 및 DENSE_RANK(): 순위 지정 및 Null 처리에서 이러한 창 함수의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!