개발 일기

[Database] 윈도우 함수(Window Function) 본문

Computer Science/Database

[Database] 윈도우 함수(Window Function)

개발 일기장 주인 2025. 2. 21. 13:47

SQLD를 공부했었는데 그때 윈도우 함수에 대해 제대로 이해하지 못하고 통과 해버린 것 같았다.

SQL을 공부하면서 뭔가 그룹을 지어서 그 그룹에 대한 통계를 내는 용도로 쓰이는 걸 봤는데 GROUP BY랑 도대체 뭐가 잘 알지 못했다.

그래서 도대체 뭐가 다른지 그리고 어떻게 쓰이는지에 대해 간단히 정리해보게 됐다.


윈도우 함수(Window Function)

SQL의 윈도우 함수란 행과 행 간을 비교, 연산, 정의하기 위한 함수이다. 

분석함수 또는 순위함수라고 하기도 한다. 

다른 함수들처럼 중첩해서 사용할 수는 없지만 서브쿼리에서는 사용가능하다.

❓그래서 GROUP BY랑 뭐가 다른데?
가장 큰 차이는 아마 결과(출력) 방식. 즉, 데이터의 유지 방식인 것 같다.
조금 더 풀어서 설명해보자면

GROUP BY의 경우 동일한 값을 가진 행들을 그룹화하고, 그룹별로 집계 연산을 수행하며 집계 후에는 각 그룹당 하나의 결과 행만 남는다. (원래 행이 사라짐)

반면에 윈도우 함수의 경우 특정 윈도우(범위, 파티션) 내에서 계산(순위, 집계, 이동)을 수행하여 결과를 반환할때 원래 테이블의 각 행을 유지한 상태에서 추가적인 집계 결과를 생성한다.

 

윈도우 함수의 기본적인 구조

윈도우_함수() OVER (
    PARTITION BY 그룹화할_컬럼  
    ORDER BY 정렬할_컬럼 [ASC | DESC]  
    [ROWS 또는 RANGE 옵션]  -- (선택 사항)
)

 

🔹 각 요소 설명

  • 윈도우_함수(): 실행할 윈도우 함수
  • PARTITION BY: 그룹을 나누는 기준 (생략 가능)
  • ORDER BY: 정렬 기준 (필수 아님, 함수에 따라 다름)
  • ROWS 또는 RANGE: 윈도우 크기를 지정하는 옵션 (필수 아님)

 

MySQL에서 사용하는 몇몇 윈도우 함수를 정리해보자.

1️⃣ 순위 관련 윈도우 함수

RANK() 동일한 값이면 같은 순위를 부여하지만, 다음 순위는 건너뜀 (1, 2, 2, 4)
DENSE_RANK() 동일한 값이면 같은 순위를 부여하고, 다음 순위는 연속 (1, 2, 2, 3)
ROW_NUMBER() 동일한 값이어도 개별적인 순위를 부여 (중복 없음, 1, 2, 3, 4)
NTILE(n) 데이터를 n개의 그룹으로 나눔

 

2️⃣ 집계(Aggregation) 윈도우 함수

SUM() 그룹 내에서 합계를 계산
AVG() 그룹 내에서 평균을 계산
MIN() 그룹 내에서 최소값을 반환
MAX() 그룹 내에서 최대값을 반환
COUNT() 그룹 내 행 개수를 반환

 

3️⃣ 이동(Moving) 윈도우 함수

LAG(column, offset, default) 이전 행 값을 가져옴 (column의 값을 offset만큼 앞에서 들고오고 없으면 default 인자로 채워넣음)
LEAD(column, offset, default) 다음 행 값을 가져옴 (column의 값을 offset만큼 뒤에서 들고오고 없으면 default 인자로 채워넣음)
FIRST_VALUE(column) 그룹 내 첫 번째 값을 반환
LAST_VALUE(column) 그룹 내 마지막 값을 반환
NTH_VALUE(column, n) 그룹 내 n번째 값을 반환

 

 

rows와 range 차이

rows는 행(row) 개수 기준으로 범위 지정하고 range는 값(value, ORDER BY 기준 컬럼)을 기준으로 범위 지정

 

✅ ROWS / RANGE에서 사용하는 키워드 정리

UNBOUNDED PRECEDING 현재 행부터 처음(최상단 행)까지 포함
UNBOUNDED FOLLOWING 현재 행부터 마지막 행까지 포함
CURRENT ROW 현재 행 포함
N PRECEDING 현재 행을 기준으로 N개의 이전 행 포함
N FOLLOWING 현재 행을 기준으로 N개의 이후 행 포함