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