SQLD 2과목 SQL 활용 고득점 윈도우 함수: RANK vs DENSE_RANK vs ROW_NUMBER 차이와 기출 풀이

노트북 모니터에 띄워진 데이터베이스 SQL 윈도우 함수 쿼리문과 자격증 시험 노트

데이터 직군 취업과 이직의 필수 자격증으로 자리 잡은 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가지

  1. PARTITION BY vs GROUP BY: GROUP BY는 여러 행을 하나로 집약(합산)하여 행 수가 줄어들지만, 윈도우 함수의 PARTITION BY는 원본 테이블의 전체 행 수를 그대로 유지한 채 부가적인 순위나 합계 컬럼만 추가합니다.
  2. 누적 합계(SUM OVER)의 ORDER BY 유무:
    • SUM(SALARY) OVER () -> 테이블 전체 급여 총합이 모든 행에 동일하게 출력
    • SUM(SALARY) OVER (ORDER BY EMP_ID) -> 첫 행부터 현재 행까지의 누적 합계(Running Total)가 순차적으로 계산되어 출력