핵심 원리
DENSE_RANK()
함수는 SQL에서 순위를 매길 때 사용되는 분석 함수입니다. RANK()
함수와 유사하지만, 동일한 순위가 있을 경우, 다음 순위의 간격을 두지 않고 연속적인 순위를 매깁니다. 예를 들어, 1위가 두 명일 경우 RANK()
함수는 그 다음 순위를 3위로 표시하지만, DENSE_RANK()
함수는 2위로 표시합니다.
실무에서 쓰이는 이유
DENSE_RANK()
함수는 순위의 연속성을 보장해야 하는 경우, 특히 데이터 분석에서 중복된 값을 가진 항목들이 있을 때 유용합니다. 예를 들어, 판매량이 동일한 제품들이 여러 개 있을 경우 이들을 같은 순위로 매기고 싶을 때 DENSE_RANK()
를 사용하면 적절합니다.
실무에서 구체적으로 어떤 상황에서 사용 되는지 예상 상황 예측
DENSE_RANK()
는 다음과 같은 상황에서 사용될 수 있습니다:
- 판매 순위 분석: 동일한 매출을 기록한 영업 사원들이 있을 때, 그들을 같은 순위로 표시하면서 그 다음 순위를 연속적으로 부여하는 경우.
- 경기 대회 순위: 여러 참가자가 동일한 점수를 받은 경우, 그들에게 동일한 순위를 부여하고 다음 순위를 연속적으로 유지해야 하는 경우.
- 제품 성능 평가: 동일한 성능 점수를 기록한 제품들이 있을 때, 그들에게 동일한 순위를 부여하고 연속적인 순위를 유지하는 경우.
연습 문제
다음 SQL 쿼리를 작성하세요:
- 직원들의 부서별 월급 순위를
DENSE_RANK()
를 사용하여 출력하세요. - 월급이 3000 이상인 직원들에 대해
DENSE_RANK()
를 사용하여 순위를 매기고 결과를 출력하세요.
연습문제 해답
SELECT deptno, ename, sal, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS rank FROM emp;
SELECT ename, sal, DENSE_RANK() OVER (ORDER BY sal DESC) AS rank
FROM emp
WHERE sal >= 3000;
응용 문제
다음 SQL 쿼리를 작성하세요:
- 1981년에 입사한 직원들의 부서별 월급 순위를
DENSE_RANK()
를 사용하여 출력하세요. - 부서별로 월급이 가장 높은 직원의 순위를 출력하고, 월급이 3000 이상인 직원들만 결과에 포함되도록 하세요.
응용문제 해답
SELECT deptno, ename, sal, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS rank FROM emp WHERE hiredate BETWEEN TO_DATE('1981/01/01', 'YYYY/MM/DD') AND TO_DATE('1981/12/31', 'YYYY/MM/DD');
SELECT deptno, ename, sal, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS rank
FROM emp
WHERE sal >= 3000;