Собесов

StrataScratch (Facebook) — Popular Posts: суммарное время просмотра ≥ 5с

SQLУсловная агрегация и HAVINGЛёгкаяJunior

Условие

Таблица 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 чуть лаконичнее.

Подводные камни

  1. Нулевые/отрицательные time_spent. В реальной таблице бывают «отрицательные» от багов трекинга. Решите: исключать (WHERE time_spent > 0) или нет.
  2. Один user_id просматривал многократно. Каждая строка — один view. Суммируем все — нормально.
  3. > vs >=. В задаче «over 5 seconds» — обычно строгое больше. Уточните на собеседовании.

Эталонный ответ

SELECT post_id, SUM(time_spent) FROM ... GROUP BY post_id HAVING SUM(time_spent) > 5. Просто, чисто, без CTE.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти