8. 윈도우 함수
SQL 윈도우 함수
1. 윈도우 함수의 기본 개념
SQL 함수는 다음 세 가지로 구분된다.
| 구분 | 설명 |
| 단일행 함수 | 각 행마다 독립적으로 결과 반환 (UPPER, DATE_FORMAT 등) |
| 복수행 함수(집계) | 여러 행을 하나의 값으로 요약 (SUM, AVG, COUNT 등) |
| 윈도우 함수 | 그룹 내 연산을 수행하지만 각 행별로 결과를 반환, 원본 데이터 유지 |
윈도우 함수는 다음과 같은 구문 구조를 가진다:
함수명(컬럼) OVER ( [PARTITION BY 컬럼] ORDER BY 컬럼 ASC/DESC )
- ORDER BY: 순서를 지정 (행 간의 관계 정의)
- PARTITION BY: 그룹을 나누어 그룹별 계산 수행
예시
SELECT DENSE_RANK() OVER(ORDER BY ORDER_DATE ASC) AS DENSE_RNK, SUM(QTY) OVER(ORDER BY ORDER_DATE ASC) AS SUM_AGG FROM SALE;
2. 윈도우 함수의 종류
윈도우 함수는 크게 순위 함수와 누적 집계 함수로 구분된다
✅ 순위 함수 (Ranking Functions)
| 함수명 | 설명 |
| ROW_NUMBER() | 동일 값이어도 고유 순위 부여 (1,2,3,4,5...) |
| RANK() | 동일 값이면 같은 순위, 다음 순위 건너뜀 (1,2,2,4...) |
| DENSE_RANK() | 동일 값이면 같은 순위, 순위 건너뛰지 않음 (1,2,2,3...) |
✅ 누적 집계 함수 (Aggregate Functions)
| 함수명 | 설명 |
| SUM() | 누적합 계산 |
| COUNT() | 누적 개수 계산 |
| AVG() | 누적 평균 계산 |
| MAX() | 누적 최대값 계산 |
| MIN() | 누적 최소값 계산 |
예시
SELECT SERVICE_NAME, SUM(SALES_AMT) OVER(PARTITION BY SERVICE_NAME ORDER BY ORDER_DATE ASC) AS SUM_AGG FROM SALE_DETAIL;
3. 일반 함수 vs 윈도우 함수
| 구분 | 결과 행 수 | 데이터 유지 여부 | 대표 예시 |
| 단일행 함수 | 그대로 | 유지 | DATE_FORMAT, LENGTH |
| 복수행 함수 | 줄어듦 | 요약됨 | SUM, AVG |
| 윈도우 함수 | 그대로 | 유지 | ROW_NUMBER, SUM() OVER() |
즉, 윈도우 함수는 집계 함수와 달리 요약하지 않고, 각 행에 계산 결과를 함께 붙여주는 형태다
예시
단일행 함수
SELECT DATE_FORMAT(JOIN_DATE, '%Y-%m') AS JOIN_MONTH FROM CUSTOMER;
복수행 함수
SELECT COUNT(MEM_NO) FROM CUSTOMER;
윈도우 함수
SELECT ROW_NUMBER() OVER(ORDER BY JOIN_DATE ASC) AS RNK FROM CUSTOMER;
4. 윈도우 함수 코딩 테스트
실무 예제를 기반으로, 윈도우 함수를 활용한 데이터 분석 실습을 진행했다
.
✅ 주요 실습 과제
1. 임시 테이블 생성
SALE, SALE_DETAIL, SERVICE 테이블을 조인하여 QTY * PRICE를 SALES_AMT로 계산
CREATE TEMPORARY TABLE WINDOW_FUNCTION_V1 AS (
SELECT A.*, B.ORDER_DETAIL_NO, QTY, PRICE, TYPE, SERVICE_NAME,
QTY * PRICE AS SALES_AMT
FROM SALE A
LEFT JOIN SALE_DETAIL B ON A.ORDER_NO = B.ORDER_NO
LEFT JOIN SERVICE C ON B.SERVICE_CODE = C.SERVICE_CODE
);
2. 서비스별 매출 순위 산출 (ROW_NUMBER)
SELECT SERVICE_NAME,
ROW_NUMBER() OVER(PARTITION BY SERVICE_NAME ORDER BY SALES_AMT DESC) AS RNK
FROM WINDOW_FUNCTION_V1;
3. 1위와 10위의 매출 차이 계산 (DENSE_RANK 활용)
SELECT SERVICE_NAME,
MAX(SALES_AMT) - MIN(SALES_AMT) AS DIFF
FROM ( ... )
HAVING MAX(RNK)=10;
4. 누적 매출(SUM_AGG) 계산
SELECT SERVICE_NAME,
SUM(SALES_AMT) OVER(PARTITION BY SERVICE_NAME ORDER BY ORDER_DATE ASC) AS SUM_AGG
FROM WINDOW_FUNCTION_V1;
5. 누적합이 10,000,000원을 초과한 최초 일자 확인
WITH BASE AS (
SELECT SERVICE_NAME,
SUM(SALES_AMT) OVER(PARTITION BY SERVICE_NAME ORDER BY ORDER_DATE ASC) AS SUM_AGG,
ORDER_DATE
FROM WINDOW_FUNCTION_V1
)
SELECT SERVICE_NAME,
MIN(ORDER_DATE) AS MIN_ORDER_DATE,
MIN(SUM_AGG) AS MIN_SUM_AGG
FROM BASE
WHERE SUM_AGG >= 10000000
GROUP BY SERVICE_NAME;
* 이 글은 제로베이스 데이터사이언스 파트타임 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.
💡 생각 정리
이번 강의는 SQL이 단순히 데이터를 “조회”하는 도구가 아니라, 시간적 흐름과 누적 관계를 표현하는 분석 도구라는 점을 깨닫게 해주었다. 특히 OVER(PARTITION BY … ORDER BY …) 구조는 데이터를 그룹화하면서도 개별 행의 맥락을 유지할 수 있어,
누적 매출, 회원 순위, 최근 거래일 기준 통계 등을 계산하는 데 매우 유용했다.
또한 ROW_NUMBER, RANK, DENSE_RANK의 미묘한 차이를 실습으로 직접 확인하면서, 순위 계산 로직을 상황에 따라 선택적으로 적용할 수 있게 되었다.
결국 윈도우 함수는 SQL을 데이터 분석 언어로 한 단계 확장시키는 핵심 요소이며,
복잡한 분석 로직을 단 몇 줄로 표현할 수 있다는 점에서 가장 강력한 기능 중 하나였다.
🚀 적용점
- ROW_NUMBER, RANK, DENSE_RANK 차이를 정리하고, 동일 데이터셋으로 결과 비교 실습하기.
- SUM() OVER(), AVG() OVER() 등 누적형 집계 함수를 활용해 월별 누적 매출·회원수 계산.
- PARTITION BY를 이용해 지역별, 고객군별 누적 데이터를 분석하는 연습하기.
- 윈도우 함수를 CASE WHEN과 결합하여 “누적 기준 이벤트”(예: 매출 1000만 돌파일) 계산하기.
- 코딩 테스트형 문제를 반복 실습하여, 분석 쿼리 작성 속도와 구조적 사고력 강화하기.
👉 이번 강의는 SQL의 “분석형 사고”를 완성하는 단계였다.
윈도우 함수를 자유롭게 활용할 수 있다면, Python 없이도 SQL만으로 충분한 데이터 분석이 가능하다.
'데이터' 카테고리의 다른 글
| 제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-10 (0) | 2025.10.09 |
|---|---|
| 제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-9 (0) | 2025.10.08 |
| 제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-7 (0) | 2025.10.06 |
| 제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-6 (0) | 2025.10.05 |
| 제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-5 (0) | 2025.10.04 |