Категории с высоким средним рейтингом
// Условие
Найдите категории товаров, у которых средний рейтинг отзывов выше 4.0 и при этом есть не менее 100 отзывов. Выведите category, avg_rating (округлить до 2 знаков) и review_count. Отсортируйте по avg_rating по убыванию.
// Таблицы
sandbox.products
product_id | INT |
product_name | VARCHAR(100) |
category | VARCHAR(30) |
price | NUMERIC(10,2) |
seller_id | INT |
sandbox.reviews
review_id | INT |
user_id | INT |
product_id | INT |
rating | INT |
review_date | DATE |
// Что тренирует
JOINGROUP BYHAVINGAVGCOUNT
// Решение
Подсказка
JOIN products и reviews. GROUP BY category. Условие на агрегат — это HAVING, а не WHERE.
Сначала попробуй сам → Показать решение
SELECT
p.category,
ROUND(AVG(r.rating), 2) AS avg_rating,
COUNT(*) AS review_count
FROM sandbox.products p
JOIN sandbox.reviews r ON p.product_id = r.product_id
GROUP BY p.category
HAVING AVG(r.rating) > 4.0
AND COUNT(*) >= 100
ORDER BY avg_rating DESC;
Ключевой момент — HAVING vs WHERE. WHERE фильтрует строки до группировки, HAVING — после. Условия AVG(rating) > 4.0 и COUNT(*) >= 100 применяются к уже сгруппированным данным, поэтому нужен HAVING. Частая ошибка на собесах: писать WHERE COUNT(*) >= 100 — это синтаксическая ошибка.