HAVING в PostgreSQL: фильтрация сгруппированных данных

HAVING в PostgreSQL используется для фильтрации результатов после группировки данных с GROUP BY. В отличие от WHERE, который фильтрует строки до группировки, HAVING применяется к агрегированным данным.

Фильтрация групп после GROUP BY

Выбор возрастных групп, в которых количество пользователей больше 5:

SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) > 5;

Сначала выполняется группировка по age, затем HAVING фильтрует группы, оставляя только те, где COUNT(*) > 5.

Использование с разными агрегатными функциями

Пример выбора городов, где средний возраст пользователей больше 30:

SELECT city, AVG(age) FROM users GROUP BY city HAVING AVG(age) > 30;

Пример выбора товаров с суммарной продажей выше 1000 единиц:

SELECT product_id, SUM(quantity) FROM sales GROUP BY product_id HAVING SUM(quantity) > 1000;

Комбинирование HAVING и WHERE

WHERE фильтрует строки перед группировкой, а HAVING — после. Например, выбор пользователей старше 18 лет и группировка по городу с фильтрацией городов, где более 10 пользователей:

SELECT city, COUNT(*) FROM users WHERE age > 18 GROUP BY city HAVING COUNT(*) > 10;