홈 › SQL 고급 › 01 / 10

순위 분석 함수

ROW_NUMBER, RANK, DENSE_RANK, NTILE
섹션 6진행 0 / 10

6. 정리

분석 함수는 함수() OVER (PARTITION BY ... ORDER BY ...) 형태로 행을 줄이지 않고 순위를 붙입니다. ROW_NUMBER 는 동점이어도 겹치지 않는 번호, RANK 는 동점 뒤를 건너뛰는 순위, DENSE_RANK 는 건너뛰지 않는 순위, NTILE(n) 은 n 개 묶음 번호입니다.

분석 함수는 SELECT 와 ORDER BY 에만 쓸 수 있고 WHERE·GROUP BY·HAVING 에는 쓸 수 없습니다. 그래서 부서별 Top-N 은 순위를 계산한 쿼리를 인라인 뷰나 CTE 로 감싸 바깥 WHERE 에서 거릅니다. 정확히 N행이면 ROW_NUMBER, 동점 포함이면 RANK 이고, ROW_NUMBER 는 ORDER BY 에 고유 컬럼을 덧붙여 동점 순서를 고정합니다.

지원 시점은 Oracle 8i, Tibero, MySQL 8.0, MSSQL 2005 부터이며, 인라인 뷰 별칭은 Oracle 이 AS 없이, MySQL·MSSQL 이 필수입니다. 같은 키 중 최신 1건만 남기는 중복 제거는 ROW_NUMBER() OVER (PARTITION BY 키 ORDER BY 날짜 DESC) = 1 패턴입니다.

SUM() OVER 로 누적합을 구하는 방법과 ROWS BETWEEN 으로 범위를 정하는 윈도 프레임은 다음 레슨(고급 02 집계 분석 함수)에서 이어집니다.