Агрегатные функции
Агрегатные функции работают в нормальном режиме, как ожидают эксперты по базам данных.
ClickHouse также поддерживает:
- Параметрические агрегатные функции, которые принимают другие параметры наряду с колонками.
- Комбинаторы, которые изменяют поведение агрегатных функций.
Обработка NULL
Во время агрегации все аргументы NULL
пропускаются. Если агрегация имеет несколько аргументов, она будет игнорировать любую строку, в которой один или несколько из них равны NULL.
Существует исключение из этого правила, которым являются функции first_value
, last_value
и их псевдонимы (any
и anyLast
соответственно), когда за ними следует модификатор RESPECT NULLS
. Например, FIRST_VALUE(b) RESPECT NULLS
.
Примеры:
Рассмотрим следующую таблицу:
Предположим, вам нужно подсчитать значения в колонке y
:
Теперь вы можете использовать функцию groupArray
, чтобы создать массив из колонки y
:
groupArray
не включает NULL
в результирующий массив.
Вы можете использовать COALESCE, чтобы заменить NULL на значение, которое имеет смысл в вашем случае. Например: avg(COALESCE(column, 0))
будет использовать значение колонки в агрегации или ноль, если NULL:
Также вы можете использовать Tuple для обхода поведения пропуска NULL. Tuple
, который содержит только значение NULL
, не является NULL
, поэтому агрегатные функции не пропустят эту строку из-за этого значения NULL
.
Обратите внимание, что агрегации пропускаются, когда колонки используются как аргументы для агрегатной функции. Например, count
без параметров (count()
) или с постоянными значениями (count(1)
) посчитает все строки в блоке (независимо от значения колонки GROUP BY, так как это не аргумент), в то время как count(column)
вернет только количество строк, где колонка не NULL.
А вот пример использования first_value с RESPECT NULLS
, где мы можем видеть, что введенные значения NULL учитываются, и функция вернет первое значение, прочитанное вне зависимости от того, является ли оно NULL или нет: