윈도우 함수

윈도우"는 **"데이터의 특정 범위"**나 **"슬라이딩 창"**을 의미합니다. 즉, 윈도우 함수는 데이터를 한 번에 처리하는 것이 아니라, 특정 범위(윈도우)에 대해 계산을 수행합니다.

윈도우 함수의 특징은 전체 테이블을 한 번에 처리하지 않고, 각 행에 대해 그 행을 포함한 일부 범위(윈도우)에 대해 작업을 한다는 점입니다. 이를 통해 전체 데이터 집합에 대한 집계나 계산을 슬라이딩 창 방식으로 할 수 있습니다.

1. 윈도우 함수 유형별 분류

순위 관련 함수

함수명 설명
RANK 순위를 계산하며, 동일한 값은 동일한 순위를 가지고 다음 순위는 건너뜀
DENSE_RANK 순위를 계산하며, 동일한 값은 동일한 순위를 가지고 다음 순위는 건너뛰지 않음
ROW_NUMBER 각 행에 고유한 순번을 부여

집계 관련 함수

함수명 설명
SUM 합계를 계산
AVG 평균을 계산
COUNT 행의 수를 계산
MAX 최대값을 계산
MIN 최소값을 계산

행 순서 관련 함수

함수명 설명
FIRST_VALUE 파티션 내의 첫 번째 값을 반환
LAST_VALUE 파티션 내의 마지막 값을 반환
LAG 이전 행의 값을 참조
LEAD 다음 행의 값을 참조

그룹내 배율 관련 함수

함수명 설명
RATIO_TO_REPORT 그룹 내 비율을 계산
PERCENT_RANK 백분율 순위를 계산
CUME_DIST 누적 분포값을 계산
NTILE 데이터를 N등분한 결과를 반환

2. 윈도우 함수 문법

윈도우 함수는 OVER() 절을 사용하여 정의됩니다. 기본 문법은 다음과 같습니다:

window_function(arguments)
OVER (
    [PARTITION BY column1, column2, ...]
    [ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...]
    [ROWS|RANGE frame_clause]
)

윈도우 함수 구문 설명

항목 설명
window_function 사용할 윈도우 함수명
arguments 함수에 전달할 인자 (선택사항)
PARTITION BY 데이터를 나누는 기준이 되는 컬럼
ORDER BY 정렬 기준이 되는 컬럼
ROWS RANGE
frame_clause 현재 행을 기준으로 연산에 포함할 행의 범위 지정

OVER() 키워드를 사용하는 이유는 그룹핑 없이 각 행마다 계산을 수행하기 위해서입니다.

일반적으로 GROUP BY를 사용하면 그룹화된 데이터에 대해서만 집계 함수(SUM(), AVG() 등)를 적용할 수 있습니다. 이 경우, 그룹화된 각 집합에 대해 한 번만 결과가 나오고, 각 행에 대한 개별적인 계산은 할 수 없습니다.

하지만 **OVER()**를 사용하면 그룹화 없이 각 행마다 집계 또는 계산을 수행할 수 있습니다. 즉, 각 행에 대해 계산을 수행하면서도, 데이터를 그룹화하거나 필터링하지 않고도 전체 데이터를 "윈도우"라는 범위로 처리하는 방식입니다.

OVER()윈도우 함수에서 중요한 역할을 하며, 다음과 같은 이유로 사용됩니다:

  1. 그룹화 없이 계산: GROUP BY 없이 데이터를 그룹화하지 않고, 각 행을 기준으로 계산할 수 있습니다. PARTITION BY를 추가하여 특정 기준에 따라 데이터를 그룹화할 수 있지만, GROUP BY처럼 결과를 한 줄로 요약하지 않고, 모든 행에 대해 결과를 개별적으로 반환할 수 있습니다.
  2. 슬라이딩 창 방식: OVER()를 사용하면 각 행을 기준으로 이전에 나온 값, 뒤에 나올 값 등을 참조하여 계산할 수 있습니다. 예를 들어, LEAD()LAG() 함수는 현재 행을 기준으로 앞뒤의 값을 처리하는데 유용합니다.
  3. 중복 계산 가능: OVER()를 사용하면 계산 결과가 각 행에 대해 중복되게 나오지만, 이는 각 행에 대해 계산된 값을 윈도우라는 범위 내에서 계속적으로 계산하겠다는 의도입니다. 예를 들어, ROW_NUMBER()는 각 행에 대해 순위를 부여하지만, 순위 계산을 특정 그룹화 없이 각 행에서 직접적으로 수행합니다.

3. 실습 예제