## Контекст
Вы аналитик финтех-сервиса с ежемесячной подпиской (как банковское premium-подписочное приложение). Продукт-менеджер просит построить **месячный retention по когортам**: для пользователей, впервые оплативших в месяц X, какая доля из них совершила хотя бы один платёж в месяц X, X+1, X+2, ... (rolling retention по месяцу лайфтайма).
## Данные
Таблица `payments`:
| Колонка | Тип | Описание |
|---|---|---|
| `payment_id` | BIGINT | ID платежа (PK) |
| `user_id` | BIGINT | ID пользователя |
| `paid_at` | DATE | Дата успешного списания |
| `amount` | NUMERIC(10,2) | Сумма, руб |
Один пользователь может платить много раз (месячные списания, докупки). В таблице только успешные платежи.
## Задание
1. Определите **когорту** каждого пользователя — месяц его **первого** платежа (`cohort_month`, первое число месяца).
2. Для каждого платежа посчитайте **month_number** — сколько полных месяцев прошло от когортного месяца до месяца платежа (0 = месяц регистрации/первого платежа, 1 = следующий месяц, и т.д.).
3. Постройте таблицу retention: для каждой пары (`cohort_month`, `month_number`) число уникальных активных пользователей и их доля от размера когорты.
**Формат ответа:** `cohort_month`, `cohort_size`, `month_number`, `active_users`, `retention_pct` (доля активных от размера когорты, %, округлить до 1 знака). Отсортировать по `cohort_month`, `month_number`.
## Уточнение
- Размер когорты (`cohort_size`) — число уникальных пользователей, впервые заплативших в этом месяце. Он один и тот же для всех `month_number` внутри когорты.
- Если в каком-то `month_number` активных нет, строку можно не выводить (заполнять нулями не требуется).
retention cohort generate_series LEFT JOIN CTE date arithmetic
Это задание для уровня hard. Senior-уровень — глубокое понимание темы, опыт решения нестандартных задач, обсуждение trade-off на собеседовании.
Подобные задания в категории «SQL» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: retention, cohort, generate_series, LEFT JOIN, CTE.
На реальном собеседовании на подобную задачу отводится 30-60 минут с обсуждением подходов, оптимизаций и trade-off. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.
На zasqlpython.ru есть 520+ SQL задач в песочнице с автопроверкой кода, конспекты SQL для аналитика, AI мок-собеседование с разбором ваших ответов.
← Все задания