SQLD
2과목
10
업데이트 2026.08.11

SQL 윈도우 함수 정리: RANK·ROW_NUMBER·누적합 한 번에 이해하기

SQLD 빈출 윈도우 함수의 PARTITION BY, ORDER BY와 RANK·DENSE_RANK·ROW_NUMBER, 누적 집계를 비교합니다.

작성·검수 가풀 · 최종 검수 2026.08.11 · 공식 자료 확인 2026.08.11

이 글의 핵심

윈도우 함수는 행을 그룹당 한 행으로 줄이지 않고 각 행에 분석 결과를 붙입니다.

PARTITION BY는 계산 구간을 나누고 ORDER BY는 구간 안의 순서를 정합니다.

동점 처리 방식에 따라 RANK, DENSE_RANK, ROW_NUMBER의 결과가 달라집니다.

GROUP BY와 윈도우 함수의 차이

GROUP BY는 여러 행을 그룹별 한 행으로 축약합니다. 윈도우 함수는 원래 행을 유지하면서 순위, 그룹 합계, 이전 행 값 같은 분석 결과를 열로 추가합니다.

사원별 급여를 그대로 보여주면서 부서 평균도 함께 표시하려면 AVG(salary) OVER (PARTITION BY department_id)를 사용할 수 있습니다.

행을 유지하는 부서 평균
SELECT employee_id, department_id, salary,
       AVG(salary) OVER (PARTITION BY department_id) AS dept_avg
FROM employees;

OVER 절을 세 부분으로 나누기

PARTITION BY는 전체 결과를 독립된 계산 구간으로 나눕니다. 생략하면 전체 행이 하나의 구간이 됩니다. ORDER BY는 각 구간에서 순서가 필요한 순위나 누적 계산의 기준을 정합니다.

ROWS 또는 RANGE로 시작 행과 끝 행을 정하는 윈도우 프레임도 있습니다. 누적합 문제에서는 현재 행까지인지 전체 구간인지 프레임을 확인해야 합니다.

RANK·DENSE_RANK·ROW_NUMBER 비교

세 함수 모두 정렬 순서에 번호를 붙이지만 동점 처리 방식이 다릅니다. 점수가 100, 90, 90, 80이라면 RANK는 1, 2, 2, 4가 되고 DENSE_RANK는 1, 2, 2, 3이 됩니다. ROW_NUMBER는 동점도 서로 다른 1, 2, 3, 4를 부여합니다.

함수동점 번호다음 번호용도
RANK같음건너뜀공동 순위
DENSE_RANK같음연속순위 단계
ROW_NUMBER서로 다름연속행 고유 번호

ROW_NUMBER에서 정렬 기준이 동점이면 어느 행이 먼저인지 보장되지 않을 수 있습니다. 안정적인 결과가 필요하면 고유한 보조 정렬 열을 추가하세요.

누적합과 이동 계산

누적합은 현재 행까지의 합계를 계산합니다. 같은 날짜에 여러 행이 있을 때 ROWS와 RANGE의 동작이 달라질 수 있으므로 시험에서 프레임이 명시되면 그대로 행 범위를 추적해야 합니다.

날짜순 누적 매출
SELECT sale_date, amount,
       SUM(amount) OVER (
         ORDER BY sale_date
         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
       ) AS running_total
FROM sales;

LEAD와 LAG로 앞뒤 행 비교하기

LAG는 현재 행보다 앞선 행의 값을, LEAD는 뒤따르는 행의 값을 가져옵니다. 월별 매출의 전월 대비 증감이나 다음 이벤트 시각을 계산할 때 셀프 조인 없이 표현할 수 있습니다.

문제를 풀 때는 먼저 PARTITION BY로 경계가 초기화되는 위치를 나누고, ORDER BY 순서대로 행 번호를 적은 뒤 함수 결과를 채우세요.

자체 제작 사례: 동점 점수에서 세 순위 함수 비교하기

점수가 90, 90, 80인 세 행을 내림차순으로 정렬한다고 가정합니다.

  1. RANK는 공동 1위 다음 순위를 건너뛰어 1, 1, 3을 반환합니다.
  2. DENSE_RANK는 순위를 이어 1, 1, 2를 반환합니다.
  3. ROW_NUMBER는 동점에도 서로 다른 번호를 주므로 안정적인 추가 정렬 기준이 필요한지 확인합니다.

동점 처리 방식과 PARTITION BY로 순위를 다시 시작하는 범위를 함께 확인해야 합니다.

흔한 오답 사고 바로잡기

윈도우 함수는 GROUP BY처럼 여러 행을 한 행으로 줄인다고 판단한다.

왜 틀리는가: 윈도우 함수는 원본 행을 유지하면서 계산 결과 열을 추가하므로 반환 행 수가 줄지 않습니다.

올바른 확인법: 집계 전후의 행 수를 먼저 적고 OVER 절의 분할·정렬·프레임을 차례로 읽습니다.

복습 체크리스트

PARTITION BY의 그룹 경계 표시

ORDER BY 동점 처리 기준 확인

RANK·DENSE_RANK·ROW_NUMBER 결과 나란히 작성

누적합은 프레임 범위까지 확인


자주 묻는 질문

윈도우 함수는 WHERE 절에서 바로 사용할 수 있나요?

일반적인 논리적 처리 순서에서 WHERE가 윈도우 함수 계산보다 먼저이므로 바로 사용할 수 없습니다. 서브쿼리나 CTE에서 계산한 뒤 바깥 쿼리에서 필터링합니다.

PARTITION BY를 생략하면 어떻게 되나요?

조회 결과 전체가 하나의 파티션이 되어 전체 행을 대상으로 순위나 집계를 계산합니다.

검수 기준과 공식 자료

이 글은 가풀이 직접 작성·검수했으며 실제 기출문제나 복원문제를 옮기지 않았습니다. 시험 일정과 세부 규정은 변경될 수 있으므로 접수 전 아래 공식 공고를 다시 확인하세요.

공식 자료 확인일 2026.08.11 · 가풀 편집 원칙 보기
2과목

SQL JOIN 완전 정리: INNER·OUTER·SELF JOIN 결과 읽는 법

읽기
2과목

GROUP BY와 HAVING 차이: SQLD 집계 문제 실수 줄이기

읽기
2과목

SQL NULL 완전 정리: COUNT·비교 연산·NVL에서 틀리지 않는 법

읽기