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

Тип AggregateFunction

Описание

Все Агрегатные функции в ClickHouse имеют между состоянием, специфичный для реализации, который может быть сериализован в тип данных AggregateFunction и сохранен в таблице. Обычно это делается с помощью материализованного представления.

Существует два агрегатных функции комбинатора, которые обычно используются с типом 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.

Если вы сбрасываете данные, например, в формате TabSeparated с помощью запроса SELECT, то этот сброс может быть загружен обратно с помощью запроса INSERT.

Выбор данных

При выборе данных из таблицы 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.