SQLD
2과목
8
업데이트 2026.08.08

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

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

이 글의 핵심

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

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 순서대로 행 번호를 적은 뒤 함수 결과를 채우세요.


자주 묻는 질문

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

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

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

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

시험 과목과 합격 기준은 KDATA SQL 개발자 공식 안내를 기준으로 확인했습니다. 가풀은 시험 주관기관의 공식 서비스가 아니며, 일정과 규정은 접수 전 공식 공고를 다시 확인해야 합니다.

2과목

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

읽기
2과목

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

읽기
2과목

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

읽기