SQL Ready | Программирование
FILTER в агрегатных функциях PostgreSQL!
В аналитических запросах часто нужно посчитать несколько показателей из одной таблицы. В PostgreSQL для этого есть FILTER, позволяющий задавать условия отдельно для каждой агрегатной функции, не влияя на весь запрос.
Представим таблицу заказов:
orders(id, customer_id, amount, status)
Посчитаем общее количество заказов и количество завершённых:
SELECT
COUNT(*) AS total_orders,
COUNT(*) FILTER (WHERE status = 'completed') AS completed_orders
FROM orders;
FILTER применяется непосредственно к агрегатной функции и ограничивает только те строки, которые участвуют в её расчёте.
Добавим несколько метрик в одном запросе:
SELECT
COUNT(*) AS total_orders,
COUNT(*) FILTER (WHERE status = 'completed') AS completed_orders,
COUNT(*) FILTER (WHERE status = 'canceled') AS canceled_orders,
SUM(amount) FILTER (WHERE status = 'completed') AS completed_amount
FROM orders;
Каждая агрегатная функция имеет собственное условие, а все значения считаются за один проход по данным — без подзапросов и лишней логики.
FILTER можно использовать с любыми агрегатами:
AVG(amount) FILTER (WHERE status = 'completed')
MAX(amount) FILTER (WHERE status = 'completed')
MIN(amount) FILTER (WHERE status = 'completed')
Важно помнить: FILTER работает только с агрегатными функциями и применяется внутри SELECT, дополняя, а не заменяя WHERE и GROUP BY.
SQL Ready | #практика Если у вас установлено приложение,
вы можете сразу перейти в канал