Все агрегатные функции в ClickHouse имеют
зависящее от реализации промежуточное состояние, которое можно сериализовать в
тип данных AggregateFunction и сохранить в таблице. Обычно это делается
с помощью materialized view.
С типом AggregateFunction обычно используются два комбинатора агрегатных функций:
- Комбинатор агрегатной функции
-State, который при добавлении к имени агрегатной
функции создает промежуточные состояния AggregateFunction.
- Комбинатор агрегатной функции
-Merge,
который используется для получения итогового результата агрегации
из промежуточных состояний.
AggregateFunction(aggregate_function_name, types_of_arguments...)
Параметры
aggregate_function_name - Имя агрегатной функции. Если функция
параметризованная, следует также указать её параметры.
types_of_arguments - Типы аргументов агрегатной функции.
например:
CREATE TABLE t
(
column1 AggregateFunction(uniq, UInt64),
column2 AggregateFunction(anyIf, String, UInt8),
column3 AggregateFunction(quantiles(0.5, 0.9), UInt64)
) ENGINE = ...
Чтобы вставить данные в таблицу со столбцами типа AggregateFunction, можно
использовать INSERT SELECT с агрегатными функциями и
комбинатором агрегатной функции
-State.
Например, для вставки в столбцы типа AggregateFunction(uniq, UInt64) и
AggregateFunction(quantiles(0.5, 0.9), UInt64) следует использовать следующие
агрегатные функции с комбинаторами.
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; все элементы массива будут агрегированы для формирования состояния
При выборке данных из таблицы AggregatingMergeTree используйте предложение GROUP BY
и те же агрегатные функции, что и при вставке данных, но с
комбинатором -Merge.
Агрегатная функция с добавленным к ней комбинатором -Merge принимает набор
состояний, объединяет их и возвращает результат полной агрегации данных.
Например, следующие два запроса возвращают один и тот же результат:
SELECT uniq(UserID) FROM table
SELECT uniqMerge(state) FROM (SELECT uniqState(UserID) AS state FROM table GROUP BY RegionID)
См. описание движка AggregatingMergeTree.
Последнее изменение 10 июня 2026 г.