Условие
Таблица netflix_views(user_id, view_date, episode_id, show_id). Найдите пользователей, которые за один календарный день посмотрели 3 и более эпизодов одного шоу (минимум один такой день).
Выход: user_id, show_id, view_date, episodes_watched.
Решение
SELECT
user_id,
show_id,
view_date,
COUNT(DISTINCT episode_id) AS episodes_watched
FROM netflix_views
GROUP BY user_id, show_id, view_date
HAVING COUNT(DISTINCT episode_id) >= 3
ORDER BY user_id, view_date;Тонкости
COUNT(DISTINCT episode_id)— если пользователь пересмотрел один и тот же эпизод 5 раз, это всё ещё один эпизод. Без DISTINCT задвоим.- Группировка по
(user_id, show_id, view_date)— потому что binge — это для конкретного шоу.
Если просят «binge events» в неделю
SELECT user_id, show_id, DATE_TRUNC('week', view_date) AS week, ...
HAVING COUNT(DISTINCT episode_id) >= 5 -- напримерТа же логика, другая агрегация по времени.
Подводные камни
- «За один день» =
view_date(DATE) илиDATE_TRUNC('day', view_timestamp). Еслиview_dateуже DATE — норм. Если TIMESTAMP — обязательноDATE_TRUNCилиCAST AS DATE. - Один эпизод смотрел 3 раза. С DISTINCT — это 1 эпизод, не binge. Без DISTINCT — задвоим.
- Часовой пояс. Если граница суток между 23:00 и 02:00 — пользователь может вылететь из «суток» в свою «ночь просмотра». Решается DATE_TRUNC в локальной tz.
Эталонный ответ
GROUP BY (user_id, show_id, view_date) HAVING COUNT(DISTINCT episode_id) >= 3. Просто, но с DISTINCT.