홈 › SQL 고급 › 01 / 10

순위 분석 함수

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

순위 분석 함수: ROW_NUMBER, RANK, DENSE_RANK, NTILE

"부서별 급여 상위 2명", "고객별 가장 최근 주문 1건"처럼 그룹 안에서 순서를 매겨 골라내는 조회는 실무에서 매우 자주 나옵니다. 이 레슨은 행을 줄이지 않고 순위를 붙이는 분석(윈도) 함수 4종의 차이와, 분석 함수를 WHERE 에 쓸 수 없어 인라인 뷰로 감싸는 Top-N·중복 제거 패턴을 익힙니다.

1. 왜 배우는가

지금까지 그룹별 값을 얻는 방법은 GROUP BY 였습니다. GROUP BY 는 그룹마다 행을 1개로 합치므로, "부서별 최고 급여"는 구해도 "그 급여를 받는 사람의 이름"이나 "2등"은 함께 보여 주기 어렵습니다. 서브쿼리로 우회하면 쿼리가 길어지고 느려지기 쉽습니다.

분석 함수는 행을 합치지 않고 각 행 옆에 계산 결과를 붙입니다. 순위 함수를 쓰면 원래 행이 그대로 남은 채 "이 행은 부서에서 몇 등인가"를 새 컬럼으로 얻고, 그 값을 기준으로 상위 N행만 골라낼 수 있습니다.

이 레슨은 ROW_NUMBER·RANK·DENSE_RANK·NTILE 의 차이, PARTITION BY 로 그룹별 순위 매기기, 인라인 뷰·CTE 로 감싸 Top-N 뽑기, 방언별 문법, 같은 키 중 최신 1건만 남기는 중복 제거를 차례로 봅니다.

참고

인라인 뷰와 파생 테이블은 중급 01 서브쿼리에서, GROUP BY 의 동작은 중급 10 집계와 GROUP BY·HAVING에서 다뤘습니다. 두 레슨을 먼저 보면 이 레슨이 수월합니다.