Конструкция фильтрация для функций агрегации

Хочу рассказать про удобную конструкцию, про которую знают далеко не все. Часто возникают ситуации, когда при агрегации нужно учесть не все строки данных, а только подходящие под определенные условия.

Конструкция такая: функция агрегации 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 на продвинутом курсе, запись в группу