> 데이터 베이스 > MySQL 튜토리얼 > Oracle의 RANK() 및 DENSE_RANK(): 순위 지정 및 Null 처리에서 이러한 창 함수의 차이점은 무엇입니까?

Oracle의 RANK() 및 DENSE_RANK(): 순위 지정 및 Null 처리에서 이러한 창 함수의 차이점은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-25 00:12:10
원래의
226명이 탐색했습니다.

RANK() vs. DENSE_RANK() in Oracle: How Do These Window Functions Differ in Ranking and Handling Nulls?

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 LASTORDER BY의 대조되는 동작을 명확하게 보여줍니다. 이 예는 특정 요구 사항에 적합한 순위 기능을 선택할 때 이러한 미묘한 차이를 이해하는 것이 중요함을 강조합니다.

위 내용은 Oracle의 RANK() 및 DENSE_RANK(): 순위 지정 및 Null 처리에서 이러한 창 함수의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿