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