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와 행 유지에 대한 설명으로 옳은 것은?
- ① PARTITION BY는 항상 행을 한 개로 합친다.
- ② 윈도우 집계는 원본 행을 유지하면서 파티션 계산 결과를 붙일 수 있다.
- ③ 윈도우 함수에는 집계를 사용할 수 없다.
- ④ OVER 안 정렬은 최종 결과 순서를 항상 보장한다.
정답과 해설 보기
정답 ②
PARTITION BY는 윈도우 계산을 나눌 영역을 정합니다. SUM(급여) OVER(PARTITION BY 부서)는 각 직원 행에 해당 부서 합계를 붙입니다. 직원 3행이 있으면 결과도 3행을 유지하며 부서별 한 행으로 줄지 않습니다. 윈도우 함수 안의 ORDER BY는 계산 순서를 정하고 최종 결과 정렬은 바깥 ORDER BY가 담당합니다. 계산 순서가 있다는 이유만으로 화면의 최종 행 순서까지 보장된다고 생각하지 마세요.
윈도우 집계는 원본 행을 유지하면서 파티션 계산 결과를 붙일 수 있다.
문제 2
윈도우 함수·순위·Top N에서 RANK·DENSE_RANK·ROW_NUMBER에 대한 설명으로 옳은 것은?
- ① RANK와 DENSE_RANK는 동률이 있어도 항상 같다.
- ② 고유 ID를 순위 기준에 추가해도 동률은 항상 유지된다.
- ③ 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는 연속 순위다.
문제 3
윈도우 함수·순위·Top N에서 ROWS와 RANGE에 대한 설명으로 옳은 것은?
- ① ROWS와 RANGE는 모든 데이터에서 항상 같다.
- ② RANGE는 반드시 단 한 행만 뜻한다.
- ③ 누적 프레임은 지정할 수 없다.
- ④ ROWS와 RANGE는 동률이 있는 정렬 값에서 누적 범위가 달라질 수 있다.
정답과 해설 보기
정답 ④
ROWS는 물리적인 행 위치, RANGE는 정렬 값의 범위를 기준으로 프레임을 정합니다. 같은 정렬 값이 여러 개일 때 RANGE ... CURRENT ROW는 같은 값의 동료 행을 함께 포함할 수 있습니다. ORDER BY가 있는 윈도우 집계의 기본 프레임을 확인하지 않으면 동률에서 누적합이 예상보다 크게 증가할 수 있습니다. 행별 순차 누적이 목적이면 명시적인 ROWS와 동률을 해소할 정렬키를 검토합니다.
ROWS와 RANGE는 동률이 있는 정렬 값에서 누적 범위가 달라질 수 있다.
문제 4
윈도우 함수·순위·Top N에서 LAG·LEAD와 앞뒤 행에 대한 설명으로 옳은 것은?
- ① LAG는 정의한 정렬과 파티션 안에서 이전 행의 값을 참조한다.
- ② 파티션은 LAG 결과에 영향을 주지 않는다.
- ③ LEAD는 이전 행만 참조한다.
- ④ LAG는 무조건 달력상 전월을 채워준다.
정답과 해설 보기
정답 ①
LAG는 정렬상 이전 행, LEAD는 다음 행의 값을 참조합니다. 전월 매출과 비교하려면 월 정렬을 정의해야 합니다. 값이 없는 경계 행의 기본 결과는 NULL이 될 수 있고 별도 기본값을 지정할 수도 있습니다. 파티션을 지정하면 이전 값도 같은 파티션 안에서 찾습니다. 상품별 전월 매출인데 파티션이 없으면 다른 상품의 매출을 가져올 수 있습니다. 데이터에 월이 빠졌다면 이전 행과 이전 달은 같은 뜻이 아니라는 점도 주의하세요.
LAG는 정의한 정렬과 파티션 안에서 이전 행의 값을 참조한다.
문제 5
윈도우 함수·순위·Top N에서 Top N과 동률 정책에 대한 설명으로 옳은 것은?
- ① ROWNUM<=N 후 ORDER BY는 항상 전체 상위N이다.
- ② WITH TIES는 동점을 무조건 삭제한다.
- ③ 상위 2등은 어떤 경우든 정확히 2행이다.
- ④ 상위 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
SQLD 전체 목차
과목별 이론
- 1과목 · 1장 1~3절 · 데이터 모델·엔터티·속성
- 1과목 · 1장 4~5절 · 관계·식별자와 카디널리티
- 1과목 · 2장 1~3절 · 정규화·조인·트랜잭션 모델
- 1과목 · 2장 4~5절 · NULL·본질식별자·인조식별자
- 2과목 · 1장 1~2절 · 관계형 DB와 SELECT·DISTINCT
- 2과목 · 1장 3절 · 문자·숫자 함수와 CASE
- 2과목 · 1장 4절 · WHERE·날짜 범위·연산자 우선순위
- 2과목 · 1장 5~6절 · 집계·GROUP BY·HAVING·ORDER BY
- 2과목 · 1장 7~8절 · INNER·OUTER·표준 조인
- 2과목 · 2장 1절 · 서브쿼리·EXISTS·스칼라 서브쿼리
- 2과목 · 2장 2~3절 · 집합 연산·ROLLUP·CUBE·GROUPING
- 2과목 · 2장 4~5절 · 윈도우 함수·순위·Top N
- 2과목 · 2장 6~8절 · 계층형 질의·셀프 조인·PIVOT·정규표현식
- 2과목 · 3장 1~2절 · DML·TCL과 트랜잭션
- 2과목 · 3장 3~4절 · DDL·DCL·제약조건·권한
단원별 객관식
- 1과목 · 1장 1~3절 · 데이터 모델·엔터티·속성
- 1과목 · 1장 4~5절 · 관계·식별자와 카디널리티
- 1과목 · 2장 1~3절 · 정규화·조인·트랜잭션 모델
- 1과목 · 2장 4~5절 · NULL·본질식별자·인조식별자
- 2과목 · 1장 1~2절 · 관계형 DB와 SELECT·DISTINCT
- 2과목 · 1장 3절 · 문자·숫자 함수와 CASE
- 2과목 · 1장 4절 · WHERE·날짜 범위·연산자 우선순위
- 2과목 · 1장 5~6절 · 집계·GROUP BY·HAVING·ORDER BY
- 2과목 · 1장 7~8절 · INNER·OUTER·표준 조인
- 2과목 · 2장 1절 · 서브쿼리·EXISTS·스칼라 서브쿼리
- 2과목 · 2장 2~3절 · 집합 연산·ROLLUP·CUBE·GROUPING
- 2과목 · 2장 4~5절 · 윈도우 함수·순위·Top N
- 2과목 · 2장 6~8절 · 계층형 질의·셀프 조인·PIVOT·정규표현식
- 2과목 · 3장 1~2절 · DML·TCL과 트랜잭션
- 2과목 · 3장 3~4절 · DDL·DCL·제약조건·권한
실습
- SQL 학습 실습 1 · 6작업 · SELECT·조건·정렬
- SQL 학습 실습 2 · 6작업 · NULL·COUNT·평균
- SQL 학습 실습 3 · 6작업 · 날짜 범위·문자 조건
- SQL 학습 실습 4 · 6작업 · GROUP BY·HAVING·조건부 합계
- SQL 학습 실습 5 · 6작업 · 조인·행 수·미주문 고객
- SQL 학습 실습 6 · 6작업 · 서브쿼리·EXISTS·NOT EXISTS
- SQL 학습 실습 7 · 6작업 · 순위·동률·고객별 Top N
- SQL 학습 실습 8 · 6작업 · 집합 연산·조건부 피벗·전체 검산