На простом примере продаж объясняем, чем отбор отдельных записей отличается от отбора готовых групп и как это влияет на итог.
Один отчёт, два разных вопроса
Представим таблицу продаж: каждая запись относится к отдельной покупке и содержит город и сумму. Руководитель хочет увидеть итог по городам. Сначала данные объединяют в группы: все покупки одного города дают один показатель. Но слово «отфильтровать» может означать две разные операции. Можно убрать некоторые покупки до подсчёта, а можно убрать из готового отчёта целые города.
Обе операции полезны, но отвечают на разные вопросы. Документация PostgreSQL прямо разделяет отбор исходных строк до вычисления групп и отбор готовых групп после вычисления. Для понимания результата не нужно знать синтаксис языка запросов — достаточно представить порядок действий.
Фильтр исходных записей меняет расчёт
Допустим, в Казани было две оплаченные покупки на 100 и 200 условных рублей и одна отменённая на 500. Если до группировки оставить только оплаченные покупки, сумма Казани составит 300. Отменённая запись не участвовала в расчёте. Так же можно сначала оставить только покупки за нужный месяц или из определённого канала, а потом получить итоги по городам.
Это подход для вопроса «сколько принесли оплаченные покупки в каждом городе». Он меняет состав исходного набора. Отчёт может выглядеть как обычная сводная таблица, но его цифры зависят от того, какие записи были допущены до подсчёта.
Фильтр готовых групп меняет список результатов
Теперь представим, что все допустимые покупки уже посчитаны по городам. Пользователь оставляет только города, где сумма выше 250. Казань с итогом 300 остаётся, город с итогом 180 исчезает целиком. Его покупки не «вычитаются» из суммы Казани: город просто не показывается отдельной строкой.
Такой отбор отвечает на вопрос «какие города достигли порога». Он применяется к уже полученным групповым показателям. В описании обработки таблиц PostgreSQL эти этапы также разделены: сначала формируется исходный набор и группы, затем можно ограничивать итоговые группы.
Условный расчёт без путаницы
Возьмём два города. В первом продажи 100 и 200, во втором — 80 и 100. Если сначала отбросить покупки меньше 100, останутся 100 и 200 в первом городе и 100 во втором. Итоги будут 300 и 100. Если же сначала сложить все покупки, получатся 300 и 180. Затем отбор городов с итогом больше 200 покажет только первый город с числом 300.
Пример условный, но он показывает главное: порог для отдельной покупки и порог для общей суммы не взаимозаменяемы. Иногда оба фильтра нужны одновременно. Тогда сначала определяют допустимые продажи, потом считают итог и лишь после этого оставляют группы, отвечающие требованию.
Как правильно сформулировать запрос к отчёту
Вместо фразы «покажите города с продажами больше 200» уточните: речь о каждой покупке или об общей сумме города? Нужно ли исключать возвраты до подсчёта? Хотите видеть все города с изменённой суммой или только города выше порога? Эти вопросы помогают избежать ситуации, когда технически правильный отчёт отвечает не на тот бизнес-вопрос.
Если сама группировка ещё не ясна, начните с объяснения, как строки превращаются в итог. Для анализа среднего показателя полезен отдельный разбор того, почему нельзя усреднять средние.
По теме
Что изучить дальше
Если хочется разобраться в том, как применять эти идеи на практике, посмотрите курс SQL инженер. Сопоставьте программу со своими задачами: один материал объясняет принцип, но не заменяет работу с реальными данными.


