Условие
Таблица facebook_post_views(user_id, post_id, time_spent). Найдите post_id и общую длительность просмотров по этому посту. В выводе оставить только посты, у которых сумма > 5 секунд.
Решение
SELECT
post_id,
SUM(time_spent) AS total_time_spent
FROM facebook_post_views
GROUP BY post_id
HAVING SUM(time_spent) > 5
ORDER BY total_time_spent DESC;WHERE vs HAVING
Фильтр до агрегации — WHERE. Фильтр после агрегации — HAVING. Здесь нам нужен суммарный показатель, поэтому только HAVING. Попытка WHERE SUM(...) > 5 — синтаксическая ошибка.
Альтернатива через subquery
SELECT * FROM (
SELECT post_id, SUM(time_spent) AS total_time_spent
FROM facebook_post_views
GROUP BY post_id
) t
WHERE total_time_spent > 5;Логически то же; HAVING чуть лаконичнее.
Подводные камни
- Нулевые/отрицательные
time_spent. В реальной таблице бывают «отрицательные» от багов трекинга. Решите: исключать (WHERE time_spent > 0) или нет. - Один user_id просматривал многократно. Каждая строка — один view. Суммируем все — нормально.
>vs>=. В задаче «over 5 seconds» — обычно строгое больше. Уточните на собеседовании.
Эталонный ответ
SELECT post_id, SUM(time_spent) FROM ... GROUP BY post_id HAVING SUM(time_spent) > 5. Просто, чисто, без CTE.