Топ-5 сериалов и фильмов по уникальным зрителям

Middle SQL Медиа

Условие задания

**Контекст:** Задание по мотивам реального тестового в ivi. Нужно составить рейтинг контента: отдельно топ-5 сериалов и топ-5 фильмов по количеству уникальных зрителей.

**Данные:**

[см. код в задании]

**Задание:**

1. Посчитайте количество уникальных зрителей для каждого фильма и каждого сериала
2. Для сериалов: зритель уникален на уровне compilation_id (смотрел любой эпизод = 1 зритель)
3. Выведите отдельно топ-5 фильмов и топ-5 сериалов по убыванию уникальных зрителей
4. При равном числе зрителей — оба попадают в топ (DENSE_RANK)

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

Структура для ориентира — реальные значения из эталонного решения.

CREATE TABLE content (
    content_id INT PRIMARY KEY,
    title VARCHAR(300) NOT NULL,
    content_type VARCHAR(20) NOT NULL,  -- 'movie' или 'episode'
    compilation_id INT,                 -- NULL для фильмов, ID сериала для эпизодов
    compilation_title VARCHAR(300)      -- название сериала (для эпизодов)
);

CREATE TABLE content_watch (
    id SERIAL PRIMARY KEY,
    user_id INT NOT NULL,
    content_id INT NOT NULL,
    watch_date DATE NOT NULL,
    watch_duration_sec INT NOT NULL
);

INSERT INTO content (content_id, title, content_type, compilation_id, compilation_title) VALUES
(1,  'Фильм Альфа',   'movie',   NULL, NULL),
(2,  'Фильм Бета',    'movie',   NULL, NULL),
(3,  'Фильм Гамма',   'movie',   NULL, NULL),
(4,  'Фильм Дельта',  'movie',   NULL, NULL),
(5,  'Фильм Эпсилон', 'movie',   NULL, NULL),
(6,  'Фильм Зета',    'movie',   NULL, NULL),
(10, 'С1Е01',          'episode', 100, 'Сериал Один'),
(11, 'С1Е02',          'episode', 100, 'Сериал Один'),
(12, 'С2Е01',          'episode', 200, 'Сериал Два'),
(13, 'С2Е02',          'episode', 200, 'Сериал Два'),
(14, 'С3Е01',          'episode', 300, 'Сериал Три'),
(15, 'С4Е01',          'episode', 400, 'Сериал Четыре'),
(16, 'С5Е01',          'episode', 500, 'Сериал Пять'),
(17, 'С6Е01',          'episode', 600, 'Сериал Шесть');

INSERT INTO content_watch (user_id, content_id, watch_date, watch_duration_sec) VALUES
(1, 1,  '2025-03-01', 5400), (2, 1,  '2025-03-01', 4000),
(3, 1,  '2025-03-02', 5400), (4, 2,  '2025-03-01', 3600),
(5, 2,  '2025-03-02', 3600), (1, 3,  '2025-03-01', 4800),
(2, 4,  '2025-03-02', 3900), (3, 5,  '2025-03-01', 4200),
(4, 5,  '2025-03-02', 4200), (5, 6,  '2025-03-01', 5000),
(1, 10, '2025-03-01', 2700), (2, 10, '2025-03-01', 2700),
(3, 11, '2025-03-02', 2800), (4, 11, '2025-03-02', 2800),
(5, 12, '2025-03-01', 3000), (1, 12, '2025-03-02', 3000),
(2, 13, '2025-03-01', 2900), (6, 14, '2025-03-01', 2500),
(7, 15, '2025-03-01', 2600), (8, 16, '2025-03-02', 2400),
(6, 10, '2025-03-02', 2700), (7, 17, '2025-03-01', 2300);

Темы

DENSE_RANK COUNT DISTINCT оконные функции compilation

Подсказки

Все тестовые задания →

Частые вопросы

Какой уровень знаний нужен для задачи "Топ-5 сериалов и фильмов по уникальным зрителям"?

Это задание для уровня Middle. Для middle-аналитиков с опытом 1-3 года, требует уверенного владения темой и понимания edge cases.

На каких собеседованиях встречается такая задача?

Подобные задания в категории «SQL» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: DENSE_RANK, COUNT DISTINCT, оконные функции, compilation.

Сколько времени даётся на решение?

На реальном собеседовании на подобную задачу отводится 15-30 минут — оцениваются подход, корректность, обработка edge cases. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.

Где ещё потренироваться по теме «SQL»?

На zasqlpython.ru есть 425 SQL задач в песочнице с автопроверкой кода, конспекты SQL для аналитика, AI мок-собеседование с разбором ваших ответов.

← Все задания