Запрос фильтрует по 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.

Разбор

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

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

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