윈도우 함수
윈도우"는 **"데이터의 특정 범위"**나 **"슬라이딩 창"**을 의미합니다. 즉, 윈도우 함수는 데이터를 한 번에 처리하는 것이 아니라, 특정 범위(윈도우)에 대해 계산을 수행합니다.
윈도우 함수의 특징은 전체 테이블을 한 번에 처리하지 않고, 각 행에 대해 그 행을 포함한 일부 범위(윈도우)에 대해 작업을 한다는 점입니다. 이를 통해 전체 데이터 집합에 대한 집계나 계산을 슬라이딩 창 방식으로 할 수 있습니다.
| 함수명 | 설명 |
|---|---|
| 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등분한 결과를 반환 |
윈도우 함수는 OVER() 절을 사용하여 정의됩니다. 기본 문법은 다음과 같습니다:
window_function(arguments)
OVER (
[PARTITION BY column1, column2, ...]
[ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...]
[ROWS|RANGE frame_clause]
)
PARTITION BY <컬럼>: 데이터를 그룹화하여 각 그룹 내에서 윈도우 함수를 적용할 수 있습니다.ORDER BY <컬럼>: 데이터를 정렬하여 순서를 고려한 결과를 도출할 수 있습니다.| 항목 | 설명 |
|---|---|
| window_function | 사용할 윈도우 함수명 |
| arguments | 함수에 전달할 인자 (선택사항) |
| PARTITION BY | 데이터를 나누는 기준이 되는 컬럼 |
| ORDER BY | 정렬 기준이 되는 컬럼 |
| ROWS | RANGE |
| frame_clause | 현재 행을 기준으로 연산에 포함할 행의 범위 지정 |
OVER()키워드를 사용하는 이유는 그룹핑 없이 각 행마다 계산을 수행하기 위해서입니다.일반적으로
GROUP BY를 사용하면 그룹화된 데이터에 대해서만 집계 함수(SUM(),AVG()등)를 적용할 수 있습니다. 이 경우, 그룹화된 각 집합에 대해 한 번만 결과가 나오고, 각 행에 대한 개별적인 계산은 할 수 없습니다.하지만 **
OVER()**를 사용하면 그룹화 없이 각 행마다 집계 또는 계산을 수행할 수 있습니다. 즉, 각 행에 대해 계산을 수행하면서도, 데이터를 그룹화하거나 필터링하지 않고도 전체 데이터를 "윈도우"라는 범위로 처리하는 방식입니다.
OVER()는 윈도우 함수에서 중요한 역할을 하며, 다음과 같은 이유로 사용됩니다:
- 그룹화 없이 계산:
GROUP BY없이 데이터를 그룹화하지 않고, 각 행을 기준으로 계산할 수 있습니다.PARTITION BY를 추가하여 특정 기준에 따라 데이터를 그룹화할 수 있지만,GROUP BY처럼 결과를 한 줄로 요약하지 않고, 모든 행에 대해 결과를 개별적으로 반환할 수 있습니다.- 슬라이딩 창 방식:
OVER()를 사용하면 각 행을 기준으로 이전에 나온 값, 뒤에 나올 값 등을 참조하여 계산할 수 있습니다. 예를 들어,LEAD()나LAG()함수는 현재 행을 기준으로 앞뒤의 값을 처리하는데 유용합니다.- 중복 계산 가능:
OVER()를 사용하면 계산 결과가 각 행에 대해 중복되게 나오지만, 이는 각 행에 대해 계산된 값을 윈도우라는 범위 내에서 계속적으로 계산하겠다는 의도입니다. 예를 들어,ROW_NUMBER()는 각 행에 대해 순위를 부여하지만, 순위 계산을 특정 그룹화 없이 각 행에서 직접적으로 수행합니다.
ROWS와 RANGE