Использование фильтрующих агрегатов
ClickHouse предоставляет простой и понятный способ задавать фильтрующие агрегаты.
Например, сравните стандартный SQL-способ записи фильтрующих агрегатов (который отлично работает в ClickHouse) с сокращённым синтаксисом с использованием комбинатора агрегатных функций -If комбинатор агрегатных функций, который можно добавить к любой агрегатной функции:
--стандартный SQL
SELECT
avg(number)
FILTER (WHERE number > 50)
FROM numbers(100)
--ClickHouse с использованием комбинатора агрегатных функций
SELECT
avgIf(number, number > 50)
FROM numbers(100)Аналогично, существует агрегатный комбинатор -Distinct:
--стандартный SQL
SELECT avg(DISTINCT number)
--ClickHouse с использованием комбинатора агрегатных функций
SELECT avgDistinct(number)Почему фильтрующие агрегаты важны? Потому что они позволяют реализовать возможность "сравнения сегментов" в сервисах веб-аналитики. Например:
WITH
Region = 'us' AS segment1,
Browser = 'Chrome' AS segment2
SELECT
uniqIf(UserID, segment1),
uniqIf(UserID, segment2)
WHERE segment1 OR segment2Подробнее см. на странице комбинатор агрегатных функций в документации.