Как посчитать video watch time в SQL

Закрепи формулу video watch time в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать video watch time в Telegram

Зачем watch time

Watch time — total seconds, проведённые в просмотре. YouTube алгоритм оптимизируется на это, не на views. Watch time показывает не «кликнули», а «реально смотрели». Главная metric для recommender систем video-платформ.

Формула

total_watch_time = SUM(seconds_watched)
avg_watch_time_per_view = SUM(seconds_watched) / COUNT(views)
avg_watch_time_per_user = SUM(seconds_watched) / COUNT(DISTINCT user_id)

Watch time в SQL

SELECT
    DATE_TRUNC('day', view_started_at)::DATE AS day,
    SUM(seconds_watched) / 3600.0 AS total_hours,
    AVG(seconds_watched) AS avg_seconds_per_view,
    SUM(seconds_watched) / NULLIF(COUNT(DISTINCT user_id), 0) AS avg_seconds_per_user
FROM video_view_events
WHERE view_started_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY DATE_TRUNC('day', view_started_at)
ORDER BY day;

Total hours per day — main growth metric для video platform.

Per-user watch time

SELECT
    user_id,
    COUNT(*) AS views,
    SUM(seconds_watched) / 60.0 AS total_minutes_watched,
    SUM(seconds_watched)::NUMERIC / NULLIF(COUNT(*), 0) AS avg_seconds_per_view
FROM video_view_events
WHERE view_started_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY user_id
HAVING SUM(seconds_watched) >= 60
ORDER BY total_minutes_watched DESC
LIMIT 100;

Top users — heavy viewers. Sentinel для retention.

Закрепи формулу video watch time в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать video watch time в Telegram

По дням и категориям

SELECT
    DATE_TRUNC('day', view_started_at)::DATE AS day,
    v.category,
    SUM(e.seconds_watched) / 3600.0 AS total_hours,
    COUNT(DISTINCT e.user_id) AS unique_viewers
FROM video_view_events e
JOIN videos v USING (video_id)
WHERE view_started_at >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY DATE_TRUNC('day', view_started_at), v.category
ORDER BY day, total_hours DESC;

Частые ошибки

Ошибка 1. View time vs watch time. View time — время на странице. Watch time — фактический playback. Не путать.

Ошибка 2. Не учитывать pause. Юзер поставил на pause 30 минут → 30 минут «watched»? Нет, нужно отличать active playback.

Ошибка 3. Включать autoplay в metric. Autoplay watch time inflated. Discount autoplay or track separately.

Ошибка 4. Sum > duration. Если seconds_watched суммируется ошибочно (multiple sessions), может быть > video duration. Cap to min(seconds, duration).

Ошибка 5. Игнорировать speed playback. Юзер смотрит на 2× → playback time 50% от content. Adjust в business metric.

Связанные темы

FAQ

Watch time per user — какой?

Casual viewers 5-15 мин/день. Power users 60+ мин/день.

Total hours — что значит?

Aggregate engagement на platform. YouTube measure billions of hours yearly.

Watch time vs views?

Views — clicks. Watch time — actual time. Recommender optimize на watch time.

Pause считается?

Зависит от tracker. Если playback paused, watch time не должен увеличиваться.

Speed 2× учитывать?

Yes — adjust в content-time units. Иначе heavy 2× watchers распознаются как low engagement.