> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# avgState

> avgState 조합자 사용 예시

<div id="description">
  ## 설명
</div>

[`State`](/ko/reference/functions/aggregate-functions/combinators#-state) 조합자는
[`avg`](/ko/reference/functions/aggregate-functions/avg)
함수에 적용할 수 있으며, 평균값에 대해 지정된 타입이 `T`일 때
`AggregateFunction(avg, T)` 타입의 중간 상태를 생성합니다.

<div id="example-usage">
  ## 사용 예시
</div>

이 예시에서는 `AggregateFunction` 유형과 `avgState` 함수를 함께 사용하여 웹사이트 트래픽 데이터를 집계하는 방법을 살펴봅니다.

먼저 웹사이트 트래픽 데이터를 위한 소스 테이블을 생성하세요:

```sql theme={null}
CREATE TABLE raw_page_views
(
    page_id UInt32,
    page_name String,
    response_time_ms UInt32,  -- 페이지 응답 시간(밀리초)
    viewed_at DateTime DEFAULT now()
)
ENGINE = MergeTree()
ORDER BY (page_id, viewed_at);
```

평균 응답 시간을 저장할 집계 테이블을 생성합니다. `avg`는 복잡한 상태(합계와 카운트)가 필요하므로 `SimpleAggregateFunction` 유형을 사용할 수 없습니다. 따라서 `AggregateFunction` 유형을 사용합니다:

```sql theme={null}
CREATE TABLE page_performance
(
    page_id UInt32,
    page_name String,
    avg_response_time AggregateFunction(avg, UInt32)  -- avg 계산에 필요한 상태를 저장합니다
)
ENGINE = AggregatingMergeTree()
ORDER BY page_id;
```

새 데이터에 대한 삽입 트리거로 작동하며 중간 상태 데이터를 위에서 정의한 대상 테이블에 저장하는 증분형 materialized view를 생성합니다:

```sql theme={null}
CREATE MATERIALIZED VIEW page_performance_mv
TO page_performance
AS SELECT
    page_id,
    page_name,
    avgState(response_time_ms) AS avg_response_time  -- -State combinator 사용
FROM raw_page_views
GROUP BY page_id, page_name;
```

소스 테이블에 초기 데이터를 삽입하여 디스크에 파트를 생성합니다:

```sql theme={null}
INSERT INTO raw_page_views (page_id, page_name, response_time_ms) VALUES
    (1, 'Homepage', 120),
    (1, 'Homepage', 135),
    (2, 'Products', 95),
    (2, 'Products', 105),
    (3, 'About', 80),
    (3, 'About', 90);
```

디스크에 두 번째 파트(part)를 생성하기 위해 데이터를 추가로 삽입합니다:

```sql theme={null}
INSERT INTO raw_page_views (page_id, page_name, response_time_ms) VALUES
(1, 'Homepage', 150),
(2, 'Products', 110),
(3, 'About', 70),
(4, 'Contact', 60),
(4, 'Contact', 65);
```

대상 테이블 `page_performance`를 확인하십시오:

```sql theme={null}
SELECT 
    page_id,
    page_name,
    avg_response_time,
    toTypeName(avg_response_time)
FROM page_performance
```

```response theme={null}
┌─page_id─┬─page_name─┬─avg_response_time─┬─toTypeName(avg_response_time)──┐
│       1 │ Homepage  │ �                 │ AggregateFunction(avg, UInt32) │
│       2 │ Products  │ �                 │ AggregateFunction(avg, UInt32) │
│       3 │ About     │ �                 │ AggregateFunction(avg, UInt32) │
│       1 │ Homepage  │ �                 │ AggregateFunction(avg, UInt32) │
│       2 │ Products  │ n                 │ AggregateFunction(avg, UInt32) │
│       3 │ About     │ F                 │ AggregateFunction(avg, UInt32) │
│       4 │ Contact   │ }                 │ AggregateFunction(avg, UInt32) │
└─────────┴───────────┴───────────────────┴────────────────────────────────┘
```

`avg_response_time` 컬럼의 타입이 `AggregateFunction(avg, UInt32)`이며 중간 상태 정보를 저장한다는 점에 주목하십시오. 또한 `avg_response_time`의 행 데이터는 실질적으로 의미가 없으며, `�, n, F, }`와 같은 알 수 없는 문자가 표시됩니다. 이는 터미널이 바이너리 데이터를 텍스트로 출력하려 할 때 나타나는 현상입니다. `AggregateFunction` 타입은 효율적인 저장 및 연산을 위해 최적화된 바이너리 형식으로 상태를 저장하기 때문에, 사람이 읽을 수 있는 형태로는 표시되지 않습니다. 이 바이너리 상태에는 평균을 계산하는 데 필요한 모든 정보가 포함되어 있습니다.

이를 활용하려면 `Merge` 컴비네이터를 사용하십시오:

```sql theme={null}
SELECT
    page_id,
    page_name,
    avgMerge(avg_response_time) AS average_response_time_ms
FROM page_performance
GROUP BY page_id, page_name
ORDER BY page_id;
```

이제 올바른 평균값을 확인할 수 있습니다:

```response theme={null}
┌─page_id─┬─page_name─┬─average_response_time_ms─┐
│       1 │ Homepage  │                      135 │
│       2 │ Products  │       103.33333333333333 │
│       3 │ About     │                       80 │
│       4 │ Contact   │                     62.5 │
└─────────┴───────────┴──────────────────────────┘
```

<div id="see-also">
  ## 관련 항목
</div>

* [`avg`](/ko/reference/functions/aggregate-functions/avg)
* [`State`](/ko/reference/functions/aggregate-functions/combinators#-state)
