Разложить MRR-движение подписки на New/Expansion/Contraction/Churn

hard Метрики Подписка

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

**Контекст.** Вы аналитик в B2B SaaS с помесячной подпиской. Финансовый директор просит объяснить, из чего сложилось изменение MRR (Monthly Recurring Revenue) между двумя соседними месяцами. Одной цифры «MRR вырос на 120 000 ₽» недостаточно — нужен MRR bridge: сколько принесли новые клиенты, сколько добавили расширения, сколько потеряли на даунгрейдах и оттоке.

**Дано.** Таблица `subscriptions_monthly` — по одной строке на активную подписку в каждом месяце (снимок на 1-е число). Если клиент в месяце отсутствует — подписка неактивна (churn/ещё не пришёл).

| колонка | тип | описание |
|---|---|---|
| `customer_id` | int | идентификатор клиента |
| `month` | date | первое число месяца (снимок) |
| `mrr` | numeric | помесячная выручка клиента в этом месяце, ₽ |

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

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

**Задание.** Сравнивая февраль 2024 с январём 2024, посчитайте компоненты MRR bridge:

1. `new_mrr` — выручка клиентов, которых не было в январе, но появились в феврале.
2. `expansion_mrr` — прирост по клиентам, которые были в обоих месяцах и увеличили MRR.
3. `contraction_mrr` — снижение по клиентам, которые были в обоих месяцах и уменьшили MRR (со знаком минус).
4. `churned_mrr` — выручка клиентов, которые были в январе, но пропали в феврале (со знаком минус).
5. Проверьте тождество: `MRR_feb - MRR_jan = new + expansion + contraction + churned`.

**Формат ответа:** одна строка с колонками `mrr_start`, `new_mrr`, `expansion_mrr`, `contraction_mrr`, `churned_mrr`, `mrr_end`.

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

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

CREATE TABLE subscriptions_monthly (
  customer_id INT,
  month       DATE,
  mrr         NUMERIC
);
INSERT INTO subscriptions_monthly (customer_id, month, mrr) VALUES
  (1, '2024-01-01', 1000), (1, '2024-02-01', 1000),  -- без изменений
  (2, '2024-01-01', 2000), (2, '2024-02-01', 3000),  -- expansion
  (3, '2024-01-01', 1500), (3, '2024-02-01',  900),  -- contraction
  (4, '2024-01-01',  800),                             -- churned в феврале
  (5, '2024-02-01', 1200),                             -- new в феврале
  (6, '2024-01-01', 2000), (6, '2024-02-01', 2000);  -- без изменений

Темы

MRR revenue bridge SQL window functions SaaS-метрики

Подсказки

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

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

Какой уровень знаний нужен для задачи "Разложить MRR-движение подписки на New/Expansion/Contraction/Churn"?

Это задание для уровня hard. Senior-уровень — глубокое понимание темы, опыт решения нестандартных задач, обсуждение trade-off на собеседовании.

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

Подобные задания в категории «Метрики» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: MRR, revenue bridge, SQL, window functions, SaaS-метрики.

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

На реальном собеседовании на подобную задачу отводится 30-60 минут с обсуждением подходов, оптимизаций и trade-off. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.

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

На zasqlpython.ru есть другие задания в категории «Метрики», продуктовые кейсы, справочник метрик, AI мок-собеседование с разбором ваших ответов.

← Все задания