Комбинаторы агрегатных функций
Имя агрегатной функции может иметь суффикс. Это изменяет работу агрегатной функции.
-If
Суффикс -If может быть добавлен к имени любой агрегатной функции. В этом случае агрегатная функция принимает дополнительный аргумент — условие (тип Uint8). Агрегатная функция обрабатывает только строки, которые удовлетворяют условию. Если условие не срабатывало ни разу, она возвращает значение по умолчанию (обычно нули или пустые строки).
Примеры: sumIf(column, cond)
, countIf(cond)
, avgIf(x, cond)
, quantilesTimingIf(level1, level2)(x, cond)
, argMinIf(arg, val, cond)
и так далее.
С помощью условных агрегатных функций вы можете вычислять агрегаты для нескольких условий одновременно, без использования подзапросов и JOIN
s. Например, условные агрегатные функции могут использоваться для реализации функциональности сравнения сегментов.
-Array
Суффикс -Array может быть добавлен к любой агрегатной функции. В этом случае агрегатная функция принимает аргументы типа 'Array(T)' (массивы) вместо аргументов типа 'T'. Если агрегатная функция принимает несколько аргументов, это должны быть массивы одинаковой длины. При обработке массивов агрегатная функция работает так же, как оригинальная агрегатная функция, применяемая ко всем элементам массива.
Пример 1: sumArray(arr)
— Суммирует все элементы всех массивов 'arr'. В этом примере это можно было бы записать проще: sum(arraySum(arr))
.
Пример 2: uniqArray(arr)
— Считает количество уникальных элементов во всех массивах 'arr'. Это можно было бы сделать проще: uniq(arrayJoin(arr))
, но не всегда возможно добавить 'arrayJoin' к запросу.
-If и -Array могут комбинироваться. Однако 'Array' должен быть первым, затем 'If'. Примеры: uniqArrayIf(arr, cond)
, quantilesTimingArrayIf(level1, level2)(arr, cond)
. Из-за этого порядка аргумент 'cond' не будет массивом.
-Map
Суффикс -Map может быть добавлен к любой агрегатной функции. Это создаст агрегатную функцию, которая получает аргумент типа Map и агрегирует значения каждого ключа карты отдельно, используя указанную агрегатную функцию. Результат также имеет тип Map.
Пример
-SimpleState
Если вы применяете этот комбинатор, агрегатная функция возвращает то же значение, но с другим типом. Это SimpleAggregateFunction(...), который может храниться в таблице для работы с AggregatingMergeTree таблицами.
Синтаксис
Аргументы
x
— Параметры агрегатной функции.
Возвращаемые значения
Значение агрегатной функции с типом SimpleAggregateFunction(...)
.
Пример
Запрос:
Результат:
-State
Если вы применяете этот комбинатор, агрегатная функция не возвращает итоговое значение (например, количество уникальных значений для функции uniq), а промежуточное состояние агрегации (для uniq
это хеш-таблица для подсчета количества уникальных значений). Это AggregateFunction(...)
, который может использоваться для дальнейшей обработки или храниться в таблице для завершения агрегации позже.
Обратите внимание, что -MapState не является инвариантом для одних и тех же данных из-за того, что порядок данных в промежуточном состоянии может изменяться, хотя это не влияет на прием этих данных.
Для работы с этими состояниями используйте:
- AggregatingMergeTree движок таблицы.
- finalizeAggregation функция.
- runningAccumulate функция.
- -Merge комбинатор.
- -MergeState комбинатор.
-Merge
Если вы применяете этот комбинатор, агрегатная функция принимает промежуточное состояние агрегации в качестве аргумента, сочетает состояния для завершения агрегации и возвращает итоговое значение.
-MergeState
Объединяет промежуточные состояния агрегации так же, как и комбинатор -Merge. Однако он не возвращает итоговое значение, а промежуточное состояние агрегации, аналогично комбинатору -State.
-ForEach
Преобразует агрегатную функцию для таблиц в агрегатную функцию для массивов, которая агрегирует соответствующие элементы массива и возвращает массив результатов. Например, sumForEach
для массивов [1, 2]
, [3, 4, 5]
и [6, 7]
возвращает результат [10, 13, 5]
после сложения соответствующих элементов массива.
-Distinct
Каждая уникальная комбинация аргументов будет агрегироваться только один раз. Повторяющиеся значения игнорируются. Примеры: sum(DISTINCT x)
(или sumDistinct(x)
), groupArray(DISTINCT x)
(или groupArrayDistinct(x)
), corrStable(DISTINCT x, y)
(или corrStableDistinct(x, y)
) и так далее.
-OrDefault
Изменяет поведение агрегатной функции.
Если у агрегатной функции нет входных значений, с этим комбинатором она возвращает значение по умолчанию для своего возвращаемого типа данных. Применяется к агрегатным функциям, которые могут принимать пустые входные данные.
-OrDefault
можно использовать с другими комбинаторами.
Синтаксис
Аргументы
x
— Параметры агрегатной функции.
Возвращаемые значения
Возвращает значение по умолчанию типа возвращаемых значений агрегатной функции, если нечего агрегировать.
Тип зависит от используемой агрегатной функции.
Пример
Запрос:
Результат:
Также -OrDefault
можно использовать с другими комбинаторами. Это полезно, когда агрегатная функция не принимает пустой ввод.
Запрос:
Результат:
-OrNull
Изменяет поведение агрегатной функции.
Этот комбинатор преобразует результат агрегатной функции в тип Nullable. Если у агрегатной функции нет значений для вычисления, она возвращает NULL.
-OrNull
можно использовать с другими комбинаторами.
Синтаксис
Аргументы
x
— Параметры агрегатной функции.
Возвращаемые значения
- Результат агрегатной функции, преобразованный в тип
Nullable
. NULL
, если нечего агрегировать.
Тип: Nullable(тип возвращаемого значения агрегатной функции)
.
Пример
Добавьте -orNull
в конце агрегатной функции.
Запрос:
Результат:
Также -OrNull
можно использовать с другими комбинаторами. Это полезно, когда агрегатная функция не принимает пустой ввод.
Запрос:
Результат:
-Resample
Позволяет вам делить данные на группы, а затем отдельно агрегировать данные в этих группах. Группы создаются путем разбивки значений из одной колонки на интервалы.
Аргументы
start
— Начальное значение всего требуемого интервала для значенийresampling_key
.stop
— Конечное значение всего требуемого интервала для значенийresampling_key
. Весь интервал не включает значениеstop
[start, stop)
.step
— Шаг для разделения всего интервала на подинтервалы. ФункцияaggFunction
выполняется по каждому из этих подинтервалов независимо.resampling_key
— Колонка, значения которой используются для разделения данных на интервалы.aggFunction_params
— ПараметрыaggFunction
.
Возвращаемые значения
- Массив результатов
aggFunction
для каждого подинтервала.
Пример
Рассмотрим таблицу people
со следующими данными:
Давайте получим имена людей, чей возраст находится в интервалах [30,60)
и [60,75)
. Поскольку мы используем целочисленное представление возраста, мы получаем возраста в интервалах [30, 59]
и [60,74]
.
Чтобы агрегировать имена в массиве, мы используем агрегатную функцию groupArray. Она принимает один аргумент. В нашем случае это колонка name
. Функция groupArrayResample
должна использовать колонку age
для агрегации имен по возрасту. Для определения требуемых интервалов мы передаем аргументы 30, 75, 30
в функцию groupArrayResample
.
Смотрим на результаты.
John
не входит в выборку, потому что он слишком молод. Другие люди распределены в соответствии с заданными возрастными интервалами.
Теперь давайте посчитаем общее количество людей и их среднюю зарплату в указанных возрастных интервалах.
-ArgMin
Суффикс -ArgMin может быть добавлен к имени любой агрегатной функции. В этом случае агрегатная функция принимает дополнительный аргумент, который должен быть любым сопоставимым выражением. Агрегатная функция обрабатывает только строки, которые имеют минимальное значение для указанного дополнительного выражения.
Примеры: sumArgMin(column, expr)
, countArgMin(expr)
, avgArgMin(x, expr)
и так далее.
-ArgMax
Похоже на суффикс -ArgMin, но обрабатывает только строки, которые имеют максимальное значение для указанного дополнительного выражения.