Агрегатные функции
Агрегатные функции работают стандартным образом, привычным для специалистов по базам данных.
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) вернет только количество строк, где column не равно NULL.
И вот пример функции first_value с RESPECT NULLS, где мы видим, что входные значения NULL учитываются, и будет возвращено первое встретившееся значение, независимо от того, является оно NULL или нет: