Войти Регистрация
Data base

211. Засчитанные прослушивания без дублей событий

Средняя

В plays приходят события прослушивания из приложения VK Музыки. Если связь пропала, приложение отправляет событие ещё раз с новым event_id. Копии одного прослушивания совпадают по user_id, track_id и played_at, а listened_sec у ранней копии может быть меньше: её отправили, пока трек ещё играл.

Схлопните копии, взяв у каждого прослушивания наибольший listened_sec. Прослушивание засчитывается, если listened_sec не меньше 30. Для каждого трека с хотя бы одним засчитанным прослушиванием верните track_id, plays — число засчитанных прослушиваний, listeners — число разных слушателей. Порядок — по plays по убыванию, затем по track_id.

В работе: Расчёт отчислений правообладателям: платят за засчитанное прослушивание, и дубль стоит денег.

Таблицы

plays — события прослушивания, возможны копии

КолонкаТипЧто значит
event_idintключ
user_idintслушатель
track_idintтрек
played_attimestampначало прослушивания
listened_secintсколько секунд прослушано

Пример: данные

plays · 7 строк

event_iduser_idtrack_idplayed_atlistened_sec
175012026-05-04T08:10:0012
275012026-05-04T08:10:00214
375012026-05-04T08:10:00214
485012026-05-04T09:00:0095
585022026-05-04T09:04:0018
695022026-05-04T10:30:0031
795032026-05-04T10:35:0029

Ожидаемый ответ

track_idplayslisteners
50122
50211
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 5 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
track_id, plays, listeners
дедупликацияGROUP BYDISTINCT

Источник: наша задача на данных VK: лог прослушиваний VK Музыки. Условие пересказано своими словами.