자격증/SQLD
[SQLD/자격증] 윈도우 함수의 프레임절(Frame Clause) 완벽 이해하기
2주녘
2025. 5. 25. 14:31
반응형
SQL 윈도우 함수의 프레임절(Frame Clause) 완벽 이해하기 📈
안녕하세요, 오늘은 SQL의 강력한 기능 중 하나인 윈도우 함수(Window Functions)에서 자주 사용되는 프레임절(Frame Clause)에 대해 자세히 알아보겠습니다.
📌 프레임절(Frame Clause)이란?
프레임절은 윈도우 함수를 사용할 때 분석할 데이터의 범위를 지정하는 역할을 합니다. 윈도우 함수는 OVER 절을 이용해 특정 범위를 정의하는데, 이때 프레임절로 범위를 구체적으로 설정합니다.
기본 형태는 다음과 같습니다
윈도우함수() OVER (
PARTITION BY 컬럼명
ORDER BY 컬럼명
[ROWS 또는 RANGE 프레임시작 AND 프레임종료]
);
🔍 ROWS와 RANGE의 차이점
1️⃣ ROWS
ROWS는 행의 물리적 위치를 기준으로 프레임을 정의합니다.
- ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING: 현재 행을 기준으로 이전 행과 다음 행을 포함
- ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: 첫 행부터 현재 행까지 포함
예시:
SELECT emp_name, salary,
AVG(salary) OVER (
ORDER BY salary
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) AS avg_salary
FROM employee;
- 각 직원의 급여를 기준으로 앞뒤 한 명씩(총 3명)의 급여 평균을 계산합니다.
2️⃣ RANGE
RANGE는 논리적인 값을 기준으로 프레임을 정의합니다. ORDER BY로 정렬된 값에 따라 프레임 범위가 결정됩니다.
- RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: ORDER BY의 값이 시작부터 현재 행까지 같은 모든 행을 포함합니다.
예시:
SELECT salary,
SUM(bonus) OVER (
ORDER BY salary
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS cumulative_bonus
FROM employee;
- 급여를 기준으로 누적된 보너스를 합산하여 나타냅니다. 급여가 동일한 모든 직원은 같은 프레임에 포함됩니다.
📝 프레임절 사용 시 주의사항
- ROWS를 사용할 때는 행 위치가 명확히 구분되지만, RANGE를 사용할 때는 동일 값이 여러 개일 경우 같은 프레임으로 묶입니다.
- 성능적인 측면에서 ROWS가 RANGE보다 일반적으로 더 빠르게 처리됩니다.
🚩 프레임절 자주 쓰는 표현
표현식 의미
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | 처음 행부터 현재 행까지 포함 |
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING | 현재 행부터 마지막 행까지 포함 |
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING | 현재 행의 이전 행과 다음 행 포함 |
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | 논리적 값 기준 처음부터 현재 값까지 포함 |
💡 외우기 쉬운 꿀팁!
- ROWS는 “Row by Row(행 단위로)“를 생각하면 물리적 행 위치로 기억하기 쉬워요!
- RANGE는 “Logical RANGE(논리적 범위)“로 논리적 값을 기준으로 기억하세요.
- “PRECEDING(이전), CURRENT(현재), FOLLOWING(이후)” 단어 뜻 그대로 외우면 이해하기 편합니다.
🎯 요약 및 결론
- 프레임절은 윈도우 함수에서 분석 범위를 명확히 정의합니다.
- 물리적 행 위치를 명확히 다룰 때는 ROWS를, 논리적 값의 범위를 다룰 때는 RANGE를 사용합니다.
- 적절한 프레임 설정을 통해 원하는 데이터를 정확히 분석할 수 있습니다.
반응형