SQL 윈도우 함수 (Window Functions) 완전 정복
잡학다식의 지식공방

IT/[SQL] Basic

SQL 윈도우 함수 (Window Functions) 완전 정복

carpe08 2025. 5. 1. 19:03
320x100

SQL 고급 기능 중 하나인 윈도우 함수(Window Functions)는 집계 함수와 비슷하면서도 더 유연하게 데이터를 분석할 수 있도록 도와줍니다. 오늘은 이 윈도우 함수가 무엇인지, 어떻게 사용하는지, 실무에서 어떻게 유용하게 활용할 수 있는지 자세히 살펴보겠습니다.


윈도우 함수란?

윈도우 함수는 각 행을 기준으로 특정 범위(윈도우)를 정해서 집계 연산을 수행하는 함수입니다. 일반적인 집계 함수(SUM, AVG 등)는 그룹 단위로 하나의 결과만 반환하지만, 윈도우 함수는 모든 행에 결과를 유지하면서도 집계 기능을 제공합니다.


기본 문법

SELECT column1,
       function(column2) OVER (PARTITION BY column3 ORDER BY column4) AS alias
FROM table;
  • function() : ROW_NUMBER(), RANK(), DENSE_RANK(), SUM(), AVG() 등 다양한 함수 사용 가능
  • OVER() : 윈도우를 정의하는 절
    • PARTITION BY : 그룹핑 기준
    • ORDER BY : 정렬 기준 (없을 수도 있음)

자주 쓰는 윈도우 함수 예시

1. ROW_NUMBER()

행마다 고유한 순번을 매깁니다.

SELECT *,
       ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS 순위
FROM employees;

→ 부서별로 급여 기준 내림차순 순위를 부여

2. RANK() vs DENSE_RANK()

동일 순위 처리 방식이 다름

SELECT *,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS 랭크,
       DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS 밀도랭크
FROM employees;

→ RANK()는 중복 순위 후 건너뛰고, DENSE_RANK()는 건너뛰지 않음

3. SUM() / AVG() 같은 집계 함수

행을 유지한 채 누적 합산

SELECT *,
       SUM(sales) OVER (PARTITION BY region ORDER BY month) AS 누적매출
FROM sales_data;

→ 지역별 월별 누적 매출 계산


프레임 정의: ROWS vs RANGE

OVER 절에서 ROWS BETWEEN ...이나 RANGE BETWEEN ...를 써서 범위 지정 가능

SELECT *,
       SUM(sales) OVER (
           ORDER BY month
           ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
       ) AS 최근3개월합
FROM sales_data;
  • ROWS : 물리적 행 기준 (ex. 최근 3개 행)
  • RANGE : 값 기준 범위 (ex. 날짜 차이로 최근 3개월)

실무에서 유용한 패턴들

✅ Top-N 뽑기 (예: 부서별 상위 1명)

WITH ranked AS (
  SELECT *,
         ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
  FROM employees
)
SELECT *
FROM ranked
WHERE rn = 1;

✅ 전월 대비 증감률 계산

SELECT *,
       sales - LAG(sales, 1) OVER (PARTITION BY region ORDER BY month) AS 전월차이
FROM sales_data;

✅ 이동 평균 계산

SELECT *,
       AVG(sales) OVER (PARTITION BY region ORDER BY month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS 이동평균
FROM sales_data;

마무리하며

윈도우 함수는 집계와 비교, 누적 계산 등을 유연하게 처리할 수 있는 SQL의 강력한 기능입니다. 데이터를 그룹으로 나누지 않고도 각 행에 대해 분석을 수행할 수 있어, 실무에서 분석/리포팅 쿼리에 자주 쓰입니다.

처음엔 생소할 수 있지만, 다양한 예제를 직접 실행해보면서 익히면 금방 익숙해질 수 있습니다. 지금 바로 업무에 적용해보세요!


[SQL 쿡북] https://link.coupang.com/a/cp14TA

 

SQL 쿡북:모든 SQL 사용자를 위한 쿼리 완벽 가이드 - 프로그래밍 언어 | 쿠팡

쿠팡에서 SQL 쿡북:모든 SQL 사용자를 위한 쿼리 완벽 가이드 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 프로그래밍 언어 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

 

320x100
320x100