데이터 직군 취업과 이직의 필수 자격증으로 자리 잡은 SQLD(SQL 개발자) 시험에서 수험생들이 가장 많이 헷갈리고 점수를 헌납하는 파트가 바로 제2과목 [SQL 활용]의 윈도우 함수(Window Function)입니다.
특히 순위를 매기는 RANK, DENSE_RANK, ROW_NUMBER 3대 함수는 매 회차 시험마다 단답형이나 선다형 보기로 100% 출제되는 대표 킬러 문항입니다. 동점자가 발생했을 때 순위 번호가 어떻게 건너뛰어지는지 예제 테이블로 명쾌하게 정리해 드립니다.
1. 순위 매기기 3대 윈도우 함수 동작 비교표
점수가 같은 동점자(예: 90점 2명)가 존재할 때 세 함수의 차이가 극명하게 갈립니다.
| 함수명 | 동점자 처리 방식 | 순위 부여 예시 (100점, 90점, 90점, 80점) |
|---|---|---|
| RANK() | 동일 순위 부여 후, 동점자 수만큼 다음 순위를 건너뜀(Skip) | 1등 -> 2등 -> 2등 -> 4등 |
| DENSE_RANK() | 동일 순위 부여 후, 건너뛰지 않고 바로 다음 연속 순위 부여 | 1등 -> 2등 -> 2등 -> 3등 |
| ROW_NUMBER() | 동점 여부와 무관하게 고유한 일련번호를 무조건 1씩 증가 | 1등 -> 2등 -> 3등 -> 4등 |
2. 실전 SQL 쿼리문과 출력 결과 예제
SELECT
EMP_NAME,
SALARY,
RANK() OVER (ORDER BY SALARY DESC) AS R1,
DENSE_RANK() OVER (ORDER BY SALARY DESC) AS R2,
ROW_NUMBER() OVER (ORDER BY SALARY DESC) AS R3
FROM EMPLOYEES;
위 쿼리를 실행했을 때 급여(SALARY)가 `[500, 400, 400, 300]`인 경우 결과는 다음과 같습니다:
- R1 (RANK): 1, 2, 2, 4 (2등이 2명이므로 3등을 건너뛰고 4등 부여)
- R2 (DENSE_RANK): 1, 2, 2, 3 ('Dense'는 빽빽하다는 뜻이므로 빈틈없이 3등 부여)
- R3 (ROW_NUMBER): 1, 2, 3, 4 (정렬 순서에 따라 고유 행 번호 부여)
3. PARTITION BY와 결합된 그룹별 순위 매기기
윈도우 함수 안에 PARTITION BY 부서코드가 들어가면 테이블 전체가 아니라 해당 부서 안에서만 독립적으로 순위가 다시 1번부터 시작됩니다.
-- 부서(DEPT_ID)별로 급여가 높은 순서대로 순위 매기기
SELECT
DEPT_ID,
EMP_NAME,
SALARY,
DENSE_RANK() OVER (PARTITION BY DEPT_ID ORDER BY SALARY DESC) AS DEPT_RANK
FROM EMPLOYEES;
4. 시험장 빈출 함정 체크포인트 2가지
- PARTITION BY vs GROUP BY:
GROUP BY는 여러 행을 하나로 집약(합산)하여 행 수가 줄어들지만, 윈도우 함수의PARTITION BY는 원본 테이블의 전체 행 수를 그대로 유지한 채 부가적인 순위나 합계 컬럼만 추가합니다. - 누적 합계(SUM OVER)의 ORDER BY 유무:
SUM(SALARY) OVER ()-> 테이블 전체 급여 총합이 모든 행에 동일하게 출력SUM(SALARY) OVER (ORDER BY EMP_ID)-> 첫 행부터 현재 행까지의 누적 합계(Running Total)가 순차적으로 계산되어 출력