Категории с выручкой за год свыше миллиона
Задача с собеседования на понимание, чем WHERE отличается от HAVING. Оба фильтруют, но на разных этапах — и здесь важно поставить каждый на своё место.
Задача
Есть таблица продаж sales(category, amount, sold_at). Выведи категории товаров, в которых выручка за 2025 год превысила 1 миллион.
Схема данных
CREATE TABLE sales (category text, amount numeric, sold_at date);
В данных есть продажи и за 2024, и за 2026 год — их нужно отсечь, чтобы в сумму попал только 2025-й.
Решение
SELECT category, SUM(amount) AS revenue
FROM sales
WHERE sold_at >= '2025-01-01' AND sold_at < '2026-01-01'
GROUP BY category
HAVING SUM(amount) > 1000000
ORDER BY revenue DESC, category;
Разбор
Тут два фильтра, и каждый — на своём этапе. WHERE sold_at >= '2025-01-01' AND sold_at < '2026-01-01' работает до группировки: он отбирает строки-продажи 2025 года ещё до того, как считается сумма. Это правильное место для фильтра по году — и семантически, и по скорости.
HAVING SUM(amount) > 1000000 работает после группировки: он отсекает уже целые группы (категории), у которых итоговая выручка не дотянула до миллиона. В WHERE так написать нельзя — там агрегата ещё не существует, суммы пока нет. Порядок логического выполнения — WHERE → GROUP BY → HAVING — и объясняет, почему год идёт в WHERE, а порог суммы в HAVING. Подробнее про это различие — в вопросе чем WHERE отличается от HAVING.
Ещё деталь про фильтр даты: я беру полуинтервал >= начало года AND < начало следующего, а не EXTRACT(YEAR FROM sold_at) = 2025. Функция на колонке мешает движку использовать индекс; диапазон дат — «дружелюбен» к индексу и работает быстрее на больших таблицах. На данных песочницы порог берут две категории. ORDER BY revenue DESC, category даёт устойчивый порядок даже при равной выручке.
Ожидаемый результат
category | revenue
--- | ---
Одежда | 1150000
Электроника | 1150000
Прорешай такие задачи сам
Читать разбор полезно, а настоящая прокачка — самому писать запросы и получать обратную связь. В симуляторе живая база и проверка запросов, лёгкий режим — бесплатно.
Прорешать в бесплатной песочнице