HAVING
Фильтрует группы после GROUP BY. В отличие от WHERE, может использовать агрегатные функции.
SELECT col, AGG(col2) FROM table GROUP BY col HAVING AGG(col2) > value;
Объяснение
Пример
-- Пользователи с более чем 5 заказами на сумму > 10000 SELECT user_id, COUNT(*) AS cnt, SUM(total) AS total FROM orders GROUP BY user_id HAVING COUNT(*) > 5 AND SUM(total) > 10000;
Связанные термины
Анекдоты по теме
Почему HAVING обижается на WHERE? — Потому что WHERE фильтрует строки ДО группировки, а HAVING — ПОСЛЕ. WHERE думает, что он главный, а HAVING знает: истина где-то в агрегатах.
— Почему новички путают HAVING и WHERE? — Потому что оба фильтруют. Но WHERE — до группировки, а HAVING — после. Как досмотр в аэропорту: сначала смотрят всех (WHERE), потом только прошедших (GROUP BY), а потом ещё раз проверяют группы (HAVING).
— STRING_AGG — это что? — Агрегирует строки через разделитель. SELECT user_id, STRING_AGG(tag, ', ') FROM user_tags GROUP BY user_id; — Превращает много строк в одну? — Да. Обратное нормализации. — А ARRAY_AGG? — То же самое, но возвращает массив вместо строки.