Условие на количество заявок в группе перенесли из HAVING в WHERE
Нужен список статусов, по которым заявок больше 40. Рабочий запрос выглядит так:
SELECT status, COUNT(*) AS cnt
FROM tickets
GROUP BY status
HAVING COUNT(*) > 40;
Коллега предлагает переписать его и перенести условие в WHERE:
SELECT status, COUNT(*) AS cnt
FROM tickets
WHERE COUNT(*) > 40
GROUP BY status;
Что получится?
- Запрос не выполнится: WHERE отбирает строки до группировки, когда агрегат ещё не посчитан, поэтому условие на COUNT(*) ставится в HAVING
- Результат не изменится: WHERE и HAVING различаются только местом в тексте запроса, а СУБД сама решает, на каком этапе применить условие к агрегату
- Запрос вернёт все статусы без исключения: условие с агрегатом в WHERE считается заведомо истинным и просто отбрасывается оптимизатором при разборе
- Запрос отфильтрует отдельные заявки: в выборку попадут только те строки, у которых значение счётчика внутри своей группы оказалось больше сорока
