데이터

제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-8

Leah (리아) 2025. 10. 7. 18:03
반응형

 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만으로 충분한 데이터 분석이 가능하다.

반응형