2026 SQLD 필기 2과목 2장 4~5절 | 윈도우 함수·순위·Top N — 핵심 이론

데이터위자드 ·

2026 SQLD 필기 2과목 2장 4~5절 | 윈도우 함수·순위·Top N — 핵심 이론

필기 · 핵심 이론

윈도우 함수는 그룹별 계산을 하면서 원본 행을 유지합니다. GROUP BY처럼 여러 행을 한 행으로 줄이는 기능과 구별하세요. 순위 동률과 누적 범위를 정하는 ORDER BY·프레임을 함께 읽어야 정확한 결과를 얻습니다.

이번 절에서 익힐 내용

PARTITION BY와 행 유지 · RANK·DENSE_RANK·ROW_NUMBER · ROWS와 RANGE · LAG·LEAD와 앞뒤 행 · Top N과 동률 정책

1. PARTITION BY와 행 유지

PARTITION BY는 윈도우 계산을 나눌 영역을 정합니다. SUM(급여) OVER(PARTITION BY 부서)는 각 직원 행에 해당 부서 합계를 붙입니다. 직원 3행이 있으면 결과도 3행을 유지하며 부서별 한 행으로 줄지 않습니다.

윈도우 함수 안의 ORDER BY는 계산 순서를 정하고 최종 결과 정렬은 바깥 ORDER BY가 담당합니다. 계산 순서가 있다는 이유만으로 화면의 최종 행 순서까지 보장된다고 생각하지 마세요.

핵심 기준

윈도우 집계는 원본 행을 유지하면서 파티션 계산 결과를 붙일 수 있다.

예제로 적용하기

A부서 급여 100·200 두 직원에 SUM(급여) OVER(PARTITION BY 부서)를 적용하면?

풀이와 판단 과정

결론: 각 직원 행에 300이 표시되는 2행

각 직원 행은 유지되고 동일 파티션 합계 300이 각각 붙습니다.

2. RANK·DENSE_RANK·ROW_NUMBER

RANK는 동률 다음 순위를 건너뛰고 DENSE_RANK는 건너뛰지 않습니다. ROW_NUMBER는 행마다 서로 다른 번호를 줍니다. 점수 100,100,90이면 RANK는 1,1,3이고 DENSE_RANK는 1,1,2입니다.

ROW_NUMBER의 동률 순서를 재현하려면 고유한 보조 정렬키를 지정하세요. 반면 동점 순위를 구할 때 순위용 ORDER BY에 고유 ID까지 넣으면 동점 자체가 사라질 수 있으므로 목적을 구분해야 합니다.

핵심 기준

RANK는 동률 다음 순위를 건너뛰고 DENSE_RANK는 연속 순위다.

예제로 적용하기

점수 100,100,90의 RANK와 DENSE_RANK 마지막 순위는?

풀이와 판단 과정

결론: 3과 2

앞선 동률 2행 때문에 RANK는 3, DENSE_RANK는 두 번째 점수 그룹이므로 2입니다.

3. ROWS와 RANGE

ROWS는 물리적인 행 위치, RANGE는 정렬 값의 범위를 기준으로 프레임을 정합니다. 같은 정렬 값이 여러 개일 때 RANGE ... CURRENT ROW는 같은 값의 동료 행을 함께 포함할 수 있습니다.

ORDER BY가 있는 윈도우 집계의 기본 프레임을 확인하지 않으면 동률에서 누적합이 예상보다 크게 증가할 수 있습니다. 행별 순차 누적이 목적이면 명시적인 ROWS와 동률을 해소할 정렬키를 검토합니다.

핵심 기준

ROWS와 RANGE는 동률이 있는 정렬 값에서 누적 범위가 달라질 수 있다.

예제로 적용하기

정렬 값이 1,1이고 금액 10,20일 때 RANGE UNBOUNDED PRECEDING~CURRENT ROW의 누적합은?

풀이와 판단 과정

결론: 두 행 모두 30

같은 정렬 값 1의 동료 행을 함께 포함하여 두 행 모두 30입니다.

4. LAG·LEAD와 앞뒤 행

LAG는 정렬상 이전 행, LEAD는 다음 행의 값을 참조합니다. 전월 매출과 비교하려면 월 정렬을 정의해야 합니다. 값이 없는 경계 행의 기본 결과는 NULL이 될 수 있고 별도 기본값을 지정할 수도 있습니다.

파티션을 지정하면 이전 값도 같은 파티션 안에서 찾습니다. 상품별 전월 매출인데 파티션이 없으면 다른 상품의 매출을 가져올 수 있습니다. 데이터에 월이 빠졌다면 이전 행과 이전 달은 같은 뜻이 아니라는 점도 주의하세요.

핵심 기준

LAG는 정의한 정렬과 파티션 안에서 이전 행의 값을 참조한다.

예제로 적용하기

1월매출 100,3월매출 150만 있을 때 월 정렬 LAG(매출)로 3월의 이전 값은?

풀이와 판단 과정

결론: 100

LAG는 이전 달을 생성하는 것이 아니라 정렬된 이전 행인 1월의 100을 참조합니다.

5. Top N과 동률 정책

정확히 N행을 원하면 ROW_NUMBER나 FETCH FIRST N ROWS 등으로 행 수를 제한하고 동률을 해소할 정렬키를 정합니다. 상위 N등을 원하면 RANK·DENSE_RANK의 정의와 동점 포함 정책을 비교합니다.

Oracle ROWNUM은 정렬과 같은 단계에 섞어 쓰면 상위 급여를 뽑기 전에 행이 제한될 수 있습니다. 정렬한 인라인 뷰 바깥에서 제한하거나 지원되는 행 제한 문법을 사용합니다. SQL Server TOP의 WITH TIES도 기준 정렬 값에 따라 행 수가 늘어날 수 있습니다.

핵심 기준

상위 N행과 상위 N등은 동점이 있을 때 결과 행 수가 달라질 수 있다.

예제로 적용하기

100,100,90에서 DENSE_RANK<=2로 상위 두 점수 등급을 고르면?

풀이와 판단 과정

결론: 3행

100은 1등급,90은 2등급이므로 세 행이 모두 포함됩니다.

한눈에 비교하기

함수·설정동점 처리100·100·90 예
RANK다음 순위 건너뜀1·1·3
DENSE_RANK연속 순위1·1·2
ROW_NUMBER고유 번호1·2·3
ROWS행 기준보조 정렬키 점검
RANGE값 범위·동료 포함동점 누적 범위 점검

순서대로 풀어 보는 예제

매출일 1일 10,1일 20,2일 30 세 행에서 날짜만 정렬한 RANGE 누적합은 30,30,60입니다. 날짜와 거래번호로 순서를 정한 ROWS 누적합은 10,30,60처럼 행별로 계산할 수 있습니다.

부서별 상위 2명을 정확히 고르려면 ROW_NUMBER() OVER(PARTITION BY 부서 ORDER BY 급여 DESC,직원번호)를 만든 뒤 바깥에서 rn<=2를 적용합니다. 동점을 모두 포함하려는 요구라면 순위 함수와 기준을 바꾸어야 합니다.

SELECT * FROM (
 SELECT e.*, ROW_NUMBER() OVER(
  PARTITION BY dept ORDER BY salary DESC,id
 ) AS rn FROM emp e
) ranked WHERE rn<=2;

헷갈리는 문장 바로잡기

PARTITION BY와 행 유지

잘못된 판단 PARTITION BY는 항상 행을 한 개로 합친다.

올바른 판단: 윈도우 집계는 원본 행을 유지하면서 파티션 계산 결과를 붙일 수 있다.

RANK·DENSE_RANK·ROW_NUMBER

잘못된 판단 ROW_NUMBER는 동률에 같은 번호를 준다.

올바른 판단: RANK는 동률 다음 순위를 건너뛰고 DENSE_RANK는 연속 순위다.

ROWS와 RANGE

잘못된 판단 ROWS와 RANGE는 모든 데이터에서 항상 같다.

올바른 판단: ROWS와 RANGE는 동률이 있는 정렬 값에서 누적 범위가 달라질 수 있다.

LAG·LEAD와 앞뒤 행

잘못된 판단 LAG는 무조건 달력상 전월을 채워준다.

올바른 판단: LAG는 정의한 정렬과 파티션 안에서 이전 행의 값을 참조한다.

Top N과 동률 정책

잘못된 판단 상위 2등은 어떤 경우든 정확히 2행이다.

올바른 판단: 상위 N행과 상위 N등은 동점이 있을 때 결과 행 수가 달라질 수 있다.

이론을 정리했다면 같은 절의 객관식 문제에서 조건과 예외를 확인하세요. 정답을 고른 뒤에는 틀린 선택지가 왜 성립하지 않는지도 설명해 보세요.

핵심 개념 확인 — 객관식 5문제

설명을 읽은 뒤 아래 다섯 문항을 풀어 보세요. 정답을 고르고 틀린 선택지의 오류도 설명할 수 있으면 이 단원의 기준을 이해한 것입니다.

문제 1

윈도우 함수·순위·Top N에서 PARTITION BY와 행 유지에 대한 설명으로 옳은 것은?

  1. ① PARTITION BY는 항상 행을 한 개로 합친다.
  2. ② 윈도우 집계는 원본 행을 유지하면서 파티션 계산 결과를 붙일 수 있다.
  3. ③ 윈도우 함수에는 집계를 사용할 수 없다.
  4. ④ OVER 안 정렬은 최종 결과 순서를 항상 보장한다.
정답과 해설 보기

정답 ②

PARTITION BY는 윈도우 계산을 나눌 영역을 정합니다. SUM(급여) OVER(PARTITION BY 부서)는 각 직원 행에 해당 부서 합계를 붙입니다. 직원 3행이 있으면 결과도 3행을 유지하며 부서별 한 행으로 줄지 않습니다. 윈도우 함수 안의 ORDER BY는 계산 순서를 정하고 최종 결과 정렬은 바깥 ORDER BY가 담당합니다. 계산 순서가 있다는 이유만으로 화면의 최종 행 순서까지 보장된다고 생각하지 마세요.

기억할 핵심

윈도우 집계는 원본 행을 유지하면서 파티션 계산 결과를 붙일 수 있다.

문제 2

윈도우 함수·순위·Top N에서 RANK·DENSE_RANK·ROW_NUMBER에 대한 설명으로 옳은 것은?

  1. ① RANK와 DENSE_RANK는 동률이 있어도 항상 같다.
  2. ② 고유 ID를 순위 기준에 추가해도 동률은 항상 유지된다.
  3. ③ RANK는 동률 다음 순위를 건너뛰고 DENSE_RANK는 연속 순위다.
  4. ④ ROW_NUMBER는 동률에 같은 번호를 준다.
정답과 해설 보기

정답 ③

RANK는 동률 다음 순위를 건너뛰고 DENSE_RANK는 건너뛰지 않습니다. ROW_NUMBER는 행마다 서로 다른 번호를 줍니다. 점수 100,100,90이면 RANK는 1,1,3이고 DENSE_RANK는 1,1,2입니다. ROW_NUMBER의 동률 순서를 재현하려면 고유한 보조 정렬키를 지정하세요. 반면 동점 순위를 구할 때 순위용 ORDER BY에 고유 ID까지 넣으면 동점 자체가 사라질 수 있으므로 목적을 구분해야 합니다.

기억할 핵심

RANK는 동률 다음 순위를 건너뛰고 DENSE_RANK는 연속 순위다.

문제 3

윈도우 함수·순위·Top N에서 ROWS와 RANGE에 대한 설명으로 옳은 것은?

  1. ① ROWS와 RANGE는 모든 데이터에서 항상 같다.
  2. ② RANGE는 반드시 단 한 행만 뜻한다.
  3. ③ 누적 프레임은 지정할 수 없다.
  4. ④ ROWS와 RANGE는 동률이 있는 정렬 값에서 누적 범위가 달라질 수 있다.
정답과 해설 보기

정답 ④

ROWS는 물리적인 행 위치, RANGE는 정렬 값의 범위를 기준으로 프레임을 정합니다. 같은 정렬 값이 여러 개일 때 RANGE ... CURRENT ROW는 같은 값의 동료 행을 함께 포함할 수 있습니다. ORDER BY가 있는 윈도우 집계의 기본 프레임을 확인하지 않으면 동률에서 누적합이 예상보다 크게 증가할 수 있습니다. 행별 순차 누적이 목적이면 명시적인 ROWS와 동률을 해소할 정렬키를 검토합니다.

기억할 핵심

ROWS와 RANGE는 동률이 있는 정렬 값에서 누적 범위가 달라질 수 있다.

문제 4

윈도우 함수·순위·Top N에서 LAG·LEAD와 앞뒤 행에 대한 설명으로 옳은 것은?

  1. ① LAG는 정의한 정렬과 파티션 안에서 이전 행의 값을 참조한다.
  2. ② 파티션은 LAG 결과에 영향을 주지 않는다.
  3. ③ LEAD는 이전 행만 참조한다.
  4. ④ LAG는 무조건 달력상 전월을 채워준다.
정답과 해설 보기

정답 ①

LAG는 정렬상 이전 행, LEAD는 다음 행의 값을 참조합니다. 전월 매출과 비교하려면 월 정렬을 정의해야 합니다. 값이 없는 경계 행의 기본 결과는 NULL이 될 수 있고 별도 기본값을 지정할 수도 있습니다. 파티션을 지정하면 이전 값도 같은 파티션 안에서 찾습니다. 상품별 전월 매출인데 파티션이 없으면 다른 상품의 매출을 가져올 수 있습니다. 데이터에 월이 빠졌다면 이전 행과 이전 달은 같은 뜻이 아니라는 점도 주의하세요.

기억할 핵심

LAG는 정의한 정렬과 파티션 안에서 이전 행의 값을 참조한다.

문제 5

윈도우 함수·순위·Top N에서 Top N과 동률 정책에 대한 설명으로 옳은 것은?

  1. ① ROWNUM<=N 후 ORDER BY는 항상 전체 상위N이다.
  2. ② WITH TIES는 동점을 무조건 삭제한다.
  3. ③ 상위 2등은 어떤 경우든 정확히 2행이다.
  4. ④ 상위 N행과 상위 N등은 동점이 있을 때 결과 행 수가 달라질 수 있다.
정답과 해설 보기

정답 ④

정확히 N행을 원하면 ROW_NUMBER나 FETCH FIRST N ROWS 등으로 행 수를 제한하고 동률을 해소할 정렬키를 정합니다. 상위 N등을 원하면 RANK·DENSE_RANK의 정의와 동점 포함 정책을 비교합니다. Oracle ROWNUM은 정렬과 같은 단계에 섞어 쓰면 상위 급여를 뽑기 전에 행이 제한될 수 있습니다. 정렬한 인라인 뷰 바깥에서 제한하거나 지원되는 행 제한 문법을 사용합니다. SQL Server TOP의 WITH TIES도 기준 정렬 값에 따라 행 수가 늘어날 수 있습니다.

기억할 핵심

상위 N행과 상위 N등은 동점이 있을 때 결과 행 수가 달라질 수 있다.

범위 확인

2026년 학습 범위를 기준으로 구성했습니다. 시험 시행기관의 자격 안내·출제 기준에서 과목과 변경 공지를 확인할 수 있습니다.

이 단원의 객관식 문제 풀기

이전 · 집합 연산·ROLLUP·CUBE·GROUPING

다음 · 계층형 질의·셀프 조인·PIVOT·정규표현식

SQLD 전체 목차

과목별 이론

단원별 객관식

실습

필기 모의고사

스터디클럽의 다른 강의 보기