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

> Документация о типе данных AggregateFunction в ClickHouse, который хранит промежуточные состояния агрегатных функций

# Тип AggregateFunction

<div id="description">
  ## Описание
</div>

Все [агрегатные функции](/ru/reference/functions/aggregate-functions/index) в ClickHouse имеют
зависящее от реализации промежуточное состояние, которое можно сериализовать в
тип данных `AggregateFunction` и сохранить в таблице. Обычно это делается
с помощью [materialized view](/ru/reference/statements/create/view).

С типом `AggregateFunction` обычно используются два [комбинатора агрегатных функций](/ru/reference/functions/aggregate-functions/combinators):

* Комбинатор агрегатной функции [`-State`](/ru/reference/functions/aggregate-functions/combinators#-state), который при добавлении к имени агрегатной
  функции создает промежуточные состояния `AggregateFunction`.
* Комбинатор агрегатной функции [`-Merge`](/ru/reference/functions/aggregate-functions/combinators#-merge),
  который используется для получения итогового результата агрегации
  из промежуточных состояний.

<div id="syntax">
  ## Синтаксис
</div>

```sql theme={null}
AggregateFunction(aggregate_function_name, types_of_arguments...)
```

**Параметры**

* `aggregate_function_name` - Имя агрегатной функции. Если функция
  параметризованная, следует также указать её параметры.
* `types_of_arguments` - Типы аргументов агрегатной функции.

например:

```sql theme={null}
CREATE TABLE t
(
    column1 AggregateFunction(uniq, UInt64),
    column2 AggregateFunction(anyIf, String, UInt8),
    column3 AggregateFunction(quantiles(0.5, 0.9), UInt64)
) ENGINE = ...
```

<div id="usage">
  ## Использование
</div>

<div id="data-insertion">
  ### Вставка данных
</div>

Чтобы вставить данные в таблицу со столбцами типа `AggregateFunction`, можно
использовать `INSERT SELECT` с агрегатными функциями и
комбинатором агрегатной функции
[`-State`](/ru/reference/functions/aggregate-functions/combinators#-state).

Например, для вставки в столбцы типа `AggregateFunction(uniq, UInt64)` и
`AggregateFunction(quantiles(0.5, 0.9), UInt64)` следует использовать следующие
агрегатные функции с комбинаторами.

```sql theme={null}
uniqState(UserID)
quantilesState(0.5, 0.9)(SendTiming)
```

В отличие от функций `uniq` и `quantiles`, `uniqState` и `quantilesState`
(с добавленным комбинатором `-State`) возвращают состояние, а не итоговое значение.
Иными словами, они возвращают значение типа `AggregateFunction`.

В результатах запроса `SELECT` значения типа `AggregateFunction` имеют
зависящее от реализации двоичное представление во всех выходных
форматах ClickHouse.

Существует специальная настройка уровня сеанса `aggregate_function_input_format`, которая позволяет строить состояние из входных значений.
Она поддерживает следующие форматы:

* `state` - двоичная строка с сериализованным состоянием (по умолчанию).
  Если вы выгружаете данные, например, в формат `TabSeparated` с помощью запроса `SELECT`,
  то этот дамп можно загрузить обратно с помощью запроса `INSERT`.
* `value` - формат ожидает одно значение аргумента агрегатной функции или, в случае нескольких аргументов, их кортеж; оно будет десериализовано для формирования соответствующего состояния
* `array` - формат ожидает Array значений, как описано выше для варианта `value`; все элементы массива будут агрегированы для формирования состояния

<div id="data-selection">
  ### Выбор данных
</div>

При выборке данных из таблицы `AggregatingMergeTree` используйте предложение `GROUP BY`
и те же агрегатные функции, что и при вставке данных, но с
комбинатором [`-Merge`](/ru/reference/functions/aggregate-functions/combinators#-merge).

Агрегатная функция с добавленным к ней комбинатором `-Merge` принимает набор
состояний, объединяет их и возвращает результат полной агрегации данных.

Например, следующие два запроса возвращают один и тот же результат:

```sql theme={null}
SELECT uniq(UserID) FROM table

SELECT uniqMerge(state) FROM (SELECT uniqState(UserID) AS state FROM table GROUP BY RegionID)
```

<div id="usage-example">
  ## Пример использования
</div>

См. описание движка [AggregatingMergeTree](/ru/reference/engines/table-engines/mergetree-family/aggregatingmergetree).

<div id="related-content">
  ## Материалы по теме
</div>

* Блог: [Использование агрегатных комбинаторов в ClickHouse](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states)
* Комбинатор [MergeState](/ru/reference/functions/aggregate-functions/combinators#-mergestate).
* Комбинатор [State](/ru/reference/functions/aggregate-functions/combinators#-state).
