Хочу рассказать про удобную конструкцию, про которую знают далеко не все. Часто возникают ситуации, когда при агрегации нужно учесть не все строки данных, а только подходящие под определенные условия.
Конструкция такая:
функция агрегации FILTER (WHERE условие фильтрации данных для учета в этой метрике)
Например, нам нужно посчитать несколько метрик
- кол-во всех клиентов по customer_id
- кол-во клиентов, у которых источник регистрации будет один из этих: direct, form, vk
Пишем запрос
SELECT
COUNT(DISTINCT customer_id),
COUNT(DISTINCT customer_id) FILTER (WHERE reg_source IN ('direct', 'form', 'vk')
FROM customers
Можно конечно писать через CASE, но конструкция с фильтром более наглядная, емкая и эффективная в плане оптимизации
SELECT
COUNT(DISTINCT customer_id),
COUNT(DISTINCT
CASE
WHEN reg_source IN ('direct', 'form', 'vk') THEN customer_id
ELSE NULL
END)
FROM customers
Еще больше фишек SQL на продвинутом курсе, запись в группу