데이터베이스 연구실.log

순위와 구간 분석

분석 함수 RANK, DENSE_RANK, ROW_NUMBER로 순위를 매기고, PARTITION BY로 그룹별 순위를 구하며, NTILE로 행을 등급 구간으로 나누는 방법과 Top-N 쿼리

RANKDENSE_RANKROW_NUMBERNTILEPARTITION BYOVER분석 함수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

SQL Developer 또는 SQL*Plus조회만 함
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

SQL Developer 또는 SQL*Plus조회만 함
SELECT deptno, ename, sal,
       RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) 순위
  FROM emp;

결과 해석: 개별 실행 출력은 기재 없음

#Top-N(그룹별 1등)

SQL Developer 또는 SQL*Plus조회만 함
SELECT *
  FROM (
        SELECT job, ename, sal,
               RANK() OVER (PARTITION BY job ORDER BY sal DESC) 순위
          FROM emp
       )
 WHERE 순위 = 1;

결과 해석:

실습의 기출 유형: WHERE RNK <= 3처럼 SELECT에서 만든 분석 함수 별칭을 같은 쿼리의 WHERE에 쓰면 오류임
실습 답은 다음과 같음

SQL Developer 또는 SQL*Plus조회만 함
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

SQL Developer 또는 SQL*Plus조회만 함
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는 실습 속성 메모와 비교 표에만 나옴
같은 값 사이의 번호 순서는 정렬 기준이 같으면 정해지지 않음(동일 값의 번호 순서 확인 불가)

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기