Перейти к основному содержанию

Описание

Все агрегатные функции в 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 г.