Сначала ответь вслух
Скажи ответ вслух хотя бы пару минут, потом открой эталон и сравни. Эталон открыт всем и не требует входа.
Показать ответ
Эталонный ответ
Логический порядок выполнения: FROM и JOIN, затем WHERE, GROUP BY, HAVING, SELECT, ORDER BY, LIMIT. WHERE работает со строками, когда групп ещё нет, поэтому COUNT(*) в нём не написать.
SELECT customer_id, COUNT(*) AS orders
FROM orders
WHERE created_at >= now() - interval '30 days' -- строки
GROUP BY customer_id
HAVING COUNT(*) >= 3; -- группыУсловия без агрегатов лучше писать в WHERE: строки отсекаются до группировки, и база делает меньше работы.
Как у тебя получилось?
Уточняющие вопросы
Так обычно копают глубже. Раскрой строку, когда ответишь вслух.
Уточнение 1-го уровня: Можно ли в WHERE сослаться на псевдоним из SELECT?
Ответ уровня Junior
Нет: SELECT вычисляется позже WHERE. В ORDER BY псевдоним использовать можно.
Уточнение 2-го уровня: Чем COUNT(*) отличается от COUNT(column)?
Ответ уровня Junior
COUNT(*) считает строки, COUNT(column) — только строки, где значение не NULL.
Типичные ошибки
- Писать условия без агрегатов в HAVING.
- Ждать, что COUNT(column) посчитает строки с NULL.
Первоисточники
Быстрые задания по теме
Для темы «JOIN и агрегаты» быстрых заданий пока нет
Можно проверить всю зону «SQL и транзакции» тестом на 10 минут.
Проверить себя за 10 минут