Найти в Дзене

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

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

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

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

Конструкция такая:

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