**Контекст:** Задание по мотивам реального тестового в 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
Это задание для уровня Middle. Для middle-аналитиков с опытом 1-3 года, требует уверенного владения темой и понимания edge cases.
Подобные задания в категории «SQL» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: DENSE_RANK, COUNT DISTINCT, оконные функции, compilation.
На реальном собеседовании на подобную задачу отводится 15-30 минут — оцениваются подход, корректность, обработка edge cases. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.
На zasqlpython.ru есть 425 SQL задач в песочнице с автопроверкой кода, конспекты SQL для аналитика, AI мок-собеседование с разбором ваших ответов.
← Все задания