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