Запрос фильтрует по created_at > '2024-01-01' и SUM(amount) > 1000. Как правильно расставить эти условия?

AОба условия можно ставить в HAVING: оптимизатор сам перенесёт фильтр по created_at в WHERE до GROUP BY
BОба условия ставятся в WHERE: HAVING нужен только для строковых фильтров и сравнений через LIKE
CУсловие SUM(amount) > 1000 в WHERE, а created_at > '2024-01-01' в HAVING после GROUP BY
DУсловие created_at > '2024-01-01' в WHERE, а SUM(amount) > 1000 в HAVING после GROUP BY
Правильный ответ. Неагрегированное условие created_at ставят в WHERE — оно уменьшает данные до группировки. Условие на агрегат SUM(amount) можно разместить только в HAVING.

Разбор

Логический порядок: WHEREGROUP BYHAVING. Условие на не-агрегированный столбец в WHERE отсекает строки до группировки — меньше данных обрабатывается. Условие SUM(amount) > 1000 невозможно вынести в WHERE, так как агрегат ещё не вычислен на этом этапе — оно должно быть в HAVING. Размещение агрегатного условия в WHERE приведёт к синтаксической ошибке.

Проверь себя · 1/3разбор после ответа
Как GROUP BY обрабатывает значения NULL в столбце группировки?
Тренировать SQL в Telegram

Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»