순위와 구간 분석
분석 함수 RANK, DENSE_RANK, ROW_NUMBER로 순위를 매기고, PARTITION BY로 그룹별 순위를 구하며, NTILE로 행을 등급 구간으로 나누는 방법과 Top-N 쿼리
#핵심 요약
RANK() OVER (ORDER BY sal DESC)는 월급이 높은 순으로 순위를 매김
같은 값이면 같은 순위임
같은 값 뒤의 순위를 건너뛰지 않으려면 DENSE_RANK, 같은 값에도 서로 다른 번호를 주려면 ROW_NUMBER를 씀
PARTITION BY 컬럼을 넣으면 그 컬럼의 값마다 따로 순위를 매김
NTILE(n)은 정렬한 행을 n개 구간(버킷)으로 나눠 구간 번호를 줌
같은 값이라도 다른 구간에 들어갈 수 있음
분석 함수는 WHERE 절에 쓸 수 없음
순위로 거르려면 인라인 뷰로 감싼 뒤 바깥 WHERE에서 거름
#개념과 동작 원리
실습 속성 메모의 비교(같은 값이 두 개 있을 때 RANK, DENSE_RANK, ROW_NUMBER 순서로 보이는 예):
| RANK | DENSE_RANK | ROW_NUMBER |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 1 | 2 |
| 3 | 2 | 3 |
| 4 | 3 | 4 |
| 5 | 4 | 5 |
DENSE_RANK: 순위는 1부터 이어지는 정수이고, 같은 값이 있어도 다음 순위를 건너뛰지 않음
같은 값은 같은 순위를 받음
분석 함수는 쿼리에서 마지막 ORDER BY를 빼고 가장 나중에 수행됨
그래서 SELECT 목록이나 ORDER BY 절에만 쓸 수 있음
NTILE: 각 구간의 행 수는 최대 1 차이가 남
나머지 행은 1번 구간부터 하나씩 더 배정됨
n이 행 수보다 크면 행 수만큼만 구간이 채워지고 나머지는 빔
설명: NTILE(4)로 나눈 4등급은 025%가 1, 2550%가 2, 5075%가 3, 75100%가 4임ORDER BY sal DESC면 월급이 높은 쪽이 1등급임
14명을 4개로 나누면 4, 4, 3, 3명이 되고, 경계에 걸린 같은 월급 사원이 다른 등급으로 갈릴 수 있음
#필수 명령어 또는 SQL
#RANK, DENSE_RANK
SELECT ename, job, sal,
RANK() OVER (ORDER BY sal DESC) 순위
FROM emp
WHERE job IN ('ANALYST', 'MANAGER');
SELECT ename, job, sal,
DENSE_RANK() OVER (ORDER BY sal DESC) 순위
FROM emp
WHERE job IN ('ANALYST', 'MANAGER');결과 해석: 개별 실행 출력은 기재 없음
#PARTITION BY
SELECT deptno, ename, sal,
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) 순위
FROM emp;결과 해석: 개별 실행 출력은 기재 없음
#Top-N(그룹별 1등)
SELECT *
FROM (
SELECT job, ename, sal,
RANK() OVER (PARTITION BY job ORDER BY sal DESC) 순위
FROM emp
)
WHERE 순위 = 1;결과 해석:
실습의 기출 유형: WHERE RNK <= 3처럼 SELECT에서 만든 분석 함수 별칭을 같은 쿼리의 WHERE에 쓰면 오류임
실습 답은 다음과 같음
SELECT ename, sal, rnk
FROM (
SELECT ename, sal, DENSE_RANK() OVER (ORDER BY sal DESC) AS rnk
FROM emp
)
WHERE rnk <= 3;결과 해석:
DENSE_RANK를 쓰면 같은 월급이 있을 때 세 사람보다 많이 나올 수 있음
정확히 세 행만 원하면 ROW_NUMBER를 씀(순위 함수 정의에서 정리)
#NTILE
SELECT ename, job, sal, NTILE(4) OVER (ORDER BY sal DESC) 등급
FROM emp
WHERE job IN ('ANALYST', 'MANAGER', 'CLERK');
SELECT deptno, ename, sal,
NTILE(4) OVER (PARTITION BY deptno ORDER BY sal DESC) 등급
FROM emp;결과 해석: 개별 실행 출력은 기재 없음
#사용 조건과 주의사항
ROW_NUMBER는 실습 속성 메모와 비교 표에만 나옴
같은 값 사이의 번호 순서는 정렬 기준이 같으면 정해지지 않음(동일 값의 번호 순서 확인 불가)