Предложение FILTER
расширяет агрегатные функции дополнительным предложением WHERE
.Если используется предложение FILTER
, то результат агрегата строится только из строк, которые также удовлетворяют условию в дополнительном предложении WHERE
.
Как правило, предложение фильтра может быть реализовано с использованием выражения CASE
внутри агрегатной функции: условие фильтра должно быть помещено в предложение WHEN
, значение, которое должно быть агрегировано в предложение THEN
.Поскольку агрегатные функции обычно пропускают значения NULL
, неявное предложение ELSE NULL
достаточно, чтобы игнорировать не подходящие под условия фильтрации строки.Следующие два выражения эквивалентны:
SUM(<expression>) FILTER(WHERE <condition>)
SUM(CASE WHEN <condition> THEN <expression> END)
Для COUNT(*)
этот пример выглядит иначе, потому что выражение “*” не может быть использовано в предложении THEN
.Вместо этого обычно используется любое константное значение не равное NULL
.
COUNT(*) FILTER(WHERE <condition>)
SUM(CASE WHEN <condition> THEN 1 END)
Примеры FILTER
Example 1. Использование предложения FILTER
SELECT
invoice_year,
SUM(revenue) FILTER (WHERE invoice_month = 1) AS jan_revenue,
SUM(revenue) FILTER (WHERE invoice_month= 2) AS feb_revenue,
...
SUM(revenue) FILTER (WHERE invoice_month = 12) AS dec_revenue
FROM (
SELECT
EXTRACT(YEAR FROM invoices.invoice_date) AS invoice_year,
EXTRACT(MONTH FROM invoices.invoice_date) AS invoice_month,
invoices.revenue AS revenue
FROM invoices
)
GROUP BY invoice_year