# 윈도우 함수

## Content

WINDOW 함수는 테이블 시트에서 데이터 분석을 위한 다양한 기능을 제공합니다. 이 함수들은 현재 행과 관련된 테이블 행 집합(윈도우)을 기준으로 계산을 수행하며, 결과를 표시하는 열을 생성합니다. 함수가 평가되는 대상이 되는 행을 현재 행(current row)이라고 합니다.
윈도우 함수는 **집계 함수, 순위 함수, 분석 함수**를 특정 윈도우에 대해 실행하며, **각 행에 대한 결과**를 생성합니다.

>type=warning
> **참고**:
>
> * 윈도우 함수의 결과는 테이블 시트의 행 순서에 영향을 줄 수 있습니다.
> * 테이블 시트가 정렬 또는 그룹화된 상태라면, 결과는 고정됩니다.
> * 테이블 시트의 계층적 데이터에 트리 구조가 포함되어 있는 경우, 윈도우 함수는 효과가 없습니다.
> * 윈도우 함수는 필터보다 먼저 평가되며, 필터는 이후 특정 행에만 적용됩니다.

`WINDOW`는 **윈도우 함수 전용으로만** 사용할 수 있으며, 기본적으로 **전체 행**을 윈도우로 간주합니다.
**구문**
`WINDOW(window_function, [partitionby_function], [orderby_function], [frame_function])`
**인수 (Arguments)**
함수의 인수는 아래와 같습니다:

| **인수명** | **설명** |
| --- | --- |
| *window\_function* | **[필수]** 윈도우 함수입니다. |
| *[partitionby\_function]* | **[선택]** 행을 파티션으로 나눕니다. |
| *[orderby\_function]* | **[선택]** 각 파티션 내 행의 논리적 순서를 정의합니다. |
| *[frame\_function]* | **[선택]** 현재 행을 기준으로 윈도우 내에서 시작 및 종료 지점을 지정합니다. |

## WINDOW

`WINDOW` 함수는 윈도우 함수가 적용되기 전에 **파티셔닝, 정렬, 윈도우 범위**를 결정합니다.
`PARTITIONBY` 및 `ORDERBY`를 사용하면 **전체 행 순서**가 재정렬되며, **뷰(view)** 내에 여러 `WINDOW` 함수가 있는 경우, 모든 `WINDOW` 함수는 동일한 `PARTITIONBY` 및 `ORDERBY`를 가져야 합니다.
그렇지 않으면 **마지막으로 적용된 `WINDOW` 함수의 순서가 전체 뷰에 적용됩니다.**
**예시**
`WINDOW(ROWNUMBER(), PARTITIONBY([country]))`
사용 가능한 모든 윈도우 함수에 대한 자세한 내용은 [윈도우 함수 목록 ](/spreadjs/docs/v18/features/tablesheet/window-functions/window-functions-list)섹션을 참조하기기 바랍니다.

## PARTITIONBY

`PARTITIONBY` 함수는 행을 오름차순으로 나눈 뒤, 각 파티션에 대해 윈도우 함수를 별도로 적용합니다. 지정하지 않으면 전체 행이 하나의 윈도우로 간주됩니다.
하나 이상의 필드 이름 또는 수식을 인수로 사용할 수 있습니다.
**구문**
`PARTITIONBY(field_function [, field_function [, ... ] ])`
**인수 (Arguments)**
함수의 인수는 아래와 같습니다:

| **인수명** | **설명** |
| --- | --- |
| *field\_function* | **[필수]** 파티셔닝할 필드 이름 또는 수식입니다. |

**예시**
`WINDOW(SUM([Sales]), PARTITIONBY([Product], YEAR([@OrderDate])))`

## ORDERBY

`ORDERBY`는 각 파티션 내 행의 논리적 순서를 정의합니다. 지정된 순서는 윈도우 정의 및 윈도우 함수의 계산 방식에 영향을 줍니다.
하나 이상의 필드 이름 또는 수식을 인수로 사용할 수 있습니다.
**구문**
`ORDERBY(field_function [, field_function [, ... ] ])`
**인수 (Arguments)**
함수의 인수는 아래와 같습니다:

| **인수명** | **설명** |
| --- | --- |
| *field\_function* | **[필수]** 정렬할 필드 이름 또는 수식입니다. |

`ORDERASC` 또는 `ORDERDESC`를 사용하여 오름차순 또는 내림차순 정렬을 지정할 수 있습니다. 기본 정렬 순서는 `ORDERASC`이며, `NULL` 값은 가장 낮은 값으로 처리됩니다.

>type=warning
> **참고:**
>
> * `ORDERBY`가 지정되지 않으면, 윈도우 함수는 기본적으로 `FRAMERANGE(-1, -1)`을 사용합니다.
> * `ORDERBY`만 지정하고 `FRAMEROWS`나 `FRAMERANGE`가 지정되지 않은 경우, 기본 윈도우 범위는 `FRAMERANGE(-1, [@])`가 됩니다.

**구문**
`ORDERASC(field function)`
`ORDERDESC(field function)`
**예시**
`WINDOW(SUM([Sales]), ORDERBY([Product], ORDERDESC(QUARTER([@OrderDate]))))`

## FRAME

`FRAME`은 현재 행을 기준으로 파티션 내 윈도우 범위를 제한합니다. 시작 및 종료, 현재 행 등을 기반으로 윈도우를 구성하며, `FRAMEROWS` 또는 `FRAMERANGE`로 정의할 수 있습니다.

### FRAMEROWS

`FRAMEROWS`는 현재 행을 기준으로 **앞뒤 고정된 행 수**를 지정하여 윈도우 범위를 설정합니다. 범위를 벗어난 값은 파티션의 처음 또는 끝 행을 사용하며, 앞뒤 모두 범위를 벗어난 경우에는 빈 윈도우가 반환됩니다.

| **매개변수** | **허용 값** | **설명** |
| ---- | ---- | --- |
| 첫 번째 매개변수<br>현재 행 이전의 행 수. | -1, [@-n] or [@] | @rows=2:**-1**: 현재 파티션의 경계를 나타냅니다.<br>**n**: 행 수를 나타내는 **0 이상의 정수**를 허용합니다.<br>**[@]**: **현재 행의 위치**를 나타냅니다. |
| 두 번째 매개변수<br>현재 행 이수의 행 수. | -1, [@+n] or [@ |

>type=warning
> **참고:** `FRAMEROWS` 함수에서 두 번째 매개변수가 생략되면 기본값은 `[@]`입니다.

**구문**
`FRAMEROWS(preceding_function [, following_function ])`
**인수 (Arguments)**
함수의 인수는 아래와 같습니다:

| **인수명** | **설명** |
| --- | --- |
| *preceding\_function* | **[필수]** 현재 행 이전의 행 수입니다. |
| *[following\_function]* | **[선택]** 현재 행 이후의 행 수입니다. |

**예시**
`WINDOW(SUM([Sales]), PARTITIONBY([Product], YEAR([@OrderDate])), ORDERBY(QUARTER([@OrderDate])), FRAMEROWS([@-1], [@]))`

### FRAMERANGE

`FRAMERANGE`는 현재 행과 `ORDERBY` 열에서 동일한 값을 가진 피어(peer) 행들을 기준으로 거리(비교 범위)를 지정하여 윈도우 범위를 제한합니다.
`FRAMERANGE` 함수는 **두 개의 주요 매개변수**를 가지며, 각각 현재 행의 피어 행 이전과 이후 거리를 나타냅니다.

| **Parameter** | **Accepted Value** | **Description** |
| --------- | -------------- | ----------- |
| 첫 번째 매개변수<br>현재 행과 동일한 값을 가진 **피어(peer) 행들 이전의 거리**를 나타냄 | `-1`, `[@-n]` (정렬이 내림차순이면 `[@+n]`, 또는 `[@]`) | @rows=2:- `-1`: 현재 파티션의 경계를 의미<br>- `n`: 0 이상의 정수로, 거리(범위)를 지정<br>- `[@]`: 현재 행과 같은 값을 가진 피어 행을 의미 |
| 두 번째 매개변수<br>현재 행과 동일한 값을 가진 **피어(peer) 행들 이후의 거리**를 나타냄 | `-1`, `[@+n]` (정렬이 내림차순이면 `[@-n]`, 또는 `[@]`) |

프레임 범위는 **양쪽이 포함된 닫힌 구간**입니다. `ORDERBY`에는 **첫 번째 열이 숫자형 데이터 타입**이어야 합니다. 하지만 정렬 기준 열이 **2개 이상**일 경우, `FRAMERANGE`에서는 **`-1`과 `[@]`만 사용 가능**합니다.

#### FRAMERANGE 와 ORDERBY

* `FRAMERANGE`는 **현재 행의 값을 기준으로 피어 행을 찾기 위해**, `ORDERBY`에 **숫자형 열 하나만** 지정되어야 합니다.
* `ORDERBY`가 없으면, `FRAMERANGE`가 지정되었더라도 기본 프레임 식은 `FRAMERANGE(-1, -1)`입니다.
* `ORDERBY`에 **2개 이상의 열이 포함**된 경우, `FRAMERANGE`에서는 `-1`과 `[@]`만 사용할 수 있으며 `[@-n]` 또는 `[@+n]`은 자동으로 `-1`로 처리됩니다. 이 경우 피어 행은 **결합된 열 값**으로 정의될 수 있습니다.

#### FRAMERANGE 와 NULL

* 정렬된 열에 `NULL` 값이 포함된 경우, `NULL` 값을 가진 행들은 파티션 내 **맨 위 또는 맨 아래**에 나란히 배치됩니다.
* 현재 피어 행의 값이 `NULL`인 경우, `[@+/-n]`은 `[@+/-0]`과 동일하게 처리되어 `[@]`와 같습니다.
* 현재 피어 행의 값이 `NULL`이 아닌 경우, `[@+/-n]` 검색은 `NULL` 값을 가진 행 이전까지로 제한됩니다.

**구문**
`FRAMERANGE(preceding_function [, following_function ])`
**인수 (Arguments)**
함수의 인수는 아래와 같습니다:

| **인수명** | **설명** |
| --- | --- |
| *preceding\_function* | **[필수]** 현재 행 이전의 거리입니다. |
| *[following\_function]* | **[선택]** 현재 행 이후의 거리입니다. |

**예시**
`WINDOW(SUM([Sales]), PARTITIONBY([Product], YEAR([@OrderDate])), ORDERBY(QUARTER([@OrderDate])), FRAMERANGE([@-1], [@]))`
아래 이미지는 집계 윈도우 함수를 사용하여 각 제품의 **이동 평균 매출** 및 **매출 추세**를 구하는 방법을 보여줍니다.
![WindowFunctions](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/df1fe1ee-eb3c-4da7-8c20-a0d8d2b7e734/WindowFunctions.bf5731.png?width=920)

### FRAMEGROUPS

FRAMEGROUPS 함수는 현재 그룹을 기준으로 "그룹" 수에 따라 시작 및 종료 경계를 지정합니다. 여기서 “그룹”은 window ORDERBY에서 도출된 동일한 값을 가진 행 집합을 의미합니다.
파티션 경계를 벗어난 그룹 수는 시작/종료 그룹으로 대체되며, 이전/이후가 모두 –1로 지정된 경우 해당됩니다. 하지만 둘 다 범위를 벗어나면 아무 것도 반환되지 않습니다.

| **매개변수** | **허용 값** | **설명** |
| ---- | ---- | --- |
| 첫 번째 매개변수<br>현재 그룹을 기준으로 시작 그룹 수를 나타냅니다. | -1, [@-n], [@+n], 또는 [@] | @rows=2:-1: 파티션의 무제한(시작 또는 종료)을 나타냅니다.<br>[@-n] 또는 [@+n]: 현재 그룹 옆의 그룹 수를 나타내며, ‘n’은 음수가 아닌 정수를 허용합니다.<br>\[@\]: 현재 그룹의 위치를 나타냅니다\. |
| 두 번째 매개변수<br>현재 그룹을 기준으로 종료 그룹 수를 나타냅니다. | -1, [@-n], [@+n] 또는 [@] |

> **참고:** FRAMEGROUPS 함수에서 두 번째 매개변수가 생략되면 기본값은 [@]입니다.

**구문**
`FRAMEGROUPS(BeginningExpression, [EndingExpression], [ExcludeMode])`
**인수**
이 함수는 다음과 같은 인수를 가집니다:

| **인수** | **설명** |
| --- | --- |
| *Beginning\_Expression* | [필수] 현재 그룹 이전의 그룹 수입니다. |
| *[Ending\_Expression]* | [선택] 현재 그룹 이후의 그룹 수입니다. |

**예제**
`WINDOW(SUM([Sales]), PARTITIONBY([Product], YEAR([@OrderDate])), ORDERBY(DATEPART([@OrderDate], "Q")), FRAMEGROUPS([@-1], [@]))`

***

#### FRAMEGROUPS와 ORDERBY

* FRAMEGROUPS는 [@]의 동일 행을 찾기 위해 현재 행의 값을 가져올 열을 제공하는 ORDERBY가 필요합니다.
* ORDERBY가 제거되면, FRAMEGROUPS가 지정되더라도 기본 프레임 표현식은 FRAMEGROUPS(-1, -1)입니다.
* ORDERBY에 여러 열이 있는 경우, 현재 동일 행은 결합된 열 값에 따라 정의됩니다. 예를 들어, 연도, 분기, 월로 정렬하는 경우 현재 동일 행은 동일한 세 열로 식별됩니다.

***

### FRAME의 EXCLUDE 모드

프레임의 exclude 모드는 FRAME 표현식의 마지막 매개변수입니다. 선택적 매개변수이며 네 가지 유형이 있습니다.

#### EXCLUDE NO OTHERS

"제외되는 행이 없음"을 의미하며 0으로 표시됩니다.
**예제**
`WINDOW(SUM([Sales]), PARTITIONBY([Product], YEAR([@OrderDate])), ORDERBY(DATEPART([@OrderDate], "Q")), FRAMEGROUPS([@-1], [@], 1))`
다음 이미지는 집계 윈도우 함수를 EXCLUDE 모드와 함께 사용하여 제품별 월별 평균 매출, 근사 평균 매출, 매출 추세를 얻는 방법을 보여줍니다.
![exclude-no-other.c0df2b.png](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/216c2e7e-5246-4c37-8843-3854aa344a6a/exclude-no-other.c0df2b.93475c.png)

#### EXCLUDE CURRENT ROW

현재 행은 제외되지만, 현재 행의 다른 동일 행은 FRAMEGROUPS 및 FRAMERANGE에 남습니다. 1로 표시됩니다.
**예제**
`WINDOW(SUM([Sales]), PARTITIONBY([Product], YEAR([@OrderDate])), ORDERBY(DATEPART([@OrderDate], "Q")), FRAMEGROUPS([@-1], [@], 1))`
다음 이미지는 집계 윈도우 함수를 EXCLUDE 모드와 함께 사용하여 제품별 월별 평균 매출, 근사 평균 매출, 매출 추세를 얻는 방법을 보여줍니다.
![exclude-currentrow.bc12da.png](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/216c2e7e-5246-4c37-8843-3854aa344a6a/exclude-currentrow.bc12da.a87c02.png)

***

#### EXCLUDE GROUP

현재 행과 동일 행이 모두 제외되며, FRAMEROWS에서도 동일하게 적용됩니다. 2로 표시됩니다.
**예제**
`WINDOW(SUM([Sales]), PARTITIONBY([Product], YEAR([@OrderDate])), ORDERBY(DATEPART([@OrderDate], "Q")), FRAMEGROUPS([@-1], [@], 2))`
다음 이미지는 집계 윈도우 함수를 EXCLUDE 모드와 함께 사용하여 제품별 월별 평균 매출, 근사 평균 매출, 매출 추세를 얻는 방법을 보여줍니다.![exclude-group.921965.png](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/216c2e7e-5246-4c37-8843-3854aa344a6a/exclude-group.921965.467e63.png)

***

#### EXCLUDE TIES

현재 행은 유지되지만, 동일 행은 제외됩니다. 3으로 표시됩니다.
**예제**
`WINDOW(SUM([Sales]), PARTITIONBY([Product], YEAR([@OrderDate])), ORDERBY(DATEPART([@OrderDate], "Q")), FRAMEGROUPS([@-1], [@], 3))`
다음 이미지는 집계 윈도우 함수를 EXCLUDE 모드와 함께 사용하여 제품별 월별 평균 매출, 근사 평균 매출, 매출 추세를 얻는 방법을 보여줍니다.
![exclude-ties.29ba9a.png](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/216c2e7e-5246-4c37-8843-3854aa344a6a/exclude-ties.29ba9a.2f7800.png)

***

### Window Chaining

Window Chaining을 사용하면 하나의 윈도우를 먼저 정의하고, 새로운 윈도우에서 PARTITIONBY, ORDERBY 또는 Window Frame을 암묵적으로 지정하여 재사용할 수 있습니다.
사전 정의된 윈도우에서는 PARTITIONBY, ORDERBY, Window Frame이 새로운 윈도우의 표현식에 의해 재정의됩니다.
**예제**
`WINDOWDEF(PARTITIONBY([Product], YEAR([@OrderDate])), ORDERBY(DATEPART([@OrderDate], "Q")), FRAMEROWS([@-2], [@], 3))`
다음 이미지는 윈도우 함수를 사용하여 제품별 매출의 평균/품질 및 매출 추세를 얻는 방법을 보여줍니다.
![window-chaining-formula.a9343f.png](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/216c2e7e-5246-4c37-8843-3854aa344a6a/window-chaining-formula.a9343f.d02def.png)