← Назад к вопросам

SQL: Найти отток клиентов (Churn)

2.3 Middle🔥 271 комментариев
#SQL и базы данных#Метрики продукта

Условие

У вас есть таблица user_activity:

  • user_id (integer)
  • activity_date (date)

Посчитайте месячный churn rate. Считаем отток, если пользователь не был активен в течение 30 дней.

Ожидаемый результат:

Таблица с колонками: month, active_users, churned_users, churn_rate

Источник: задача на расчет метрик

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

SQL: Найти отток клиентов (Churn)

Определение Churn

Churn Rate — доля пользователей, которые не были активны в течение 30 дней от последней активности.

Решение 1: Базовый churn (пользователи неактивные 30+ дней)

WITH last_activity AS (
    SELECT user_id, MAX(activity_date) as last_active_date
    FROM user_activity
    GROUP BY user_id
)
SELECT
    DATE_TRUNC(NOW(), MONTH) as month,
    COUNT(*) as active_users,
    SUM(CASE WHEN DATE_DIFF(NOW(), last_active_date) >= 30 THEN 1 ELSE 0 END) as churned_users,
    ROUND(100.0 * SUM(CASE WHEN DATE_DIFF(NOW(), last_active_date) >= 30 THEN 1 ELSE 0 END) / COUNT(*), 2) as churn_rate
FROM last_activity;

Решение 2: Месячный когортный churn (более точный)

WITH monthly_users AS (
    SELECT DATE_TRUNC(activity_date, MONTH) as month, user_id
    FROM user_activity
    GROUP BY DATE_TRUNC(activity_date, MONTH), user_id
),
user_with_next_month AS (
    SELECT
        month,
        user_id,
        LEAD(month) OVER (PARTITION BY user_id ORDER BY month) as next_month
    FROM monthly_users
)
SELECT
    DATE_FORMAT(month, '%Y-%m') as month,
    COUNT(DISTINCT user_id) as active_users,
    COUNT(DISTINCT CASE WHEN next_month IS NULL OR next_month > DATE_ADD(month, INTERVAL 1 MONTH) THEN user_id END) as churned_users,
    ROUND(100.0 * COUNT(DISTINCT CASE WHEN next_month IS NULL OR next_month > DATE_ADD(month, INTERVAL 1 MONTH) THEN user_id END) / COUNT(DISTINCT user_id), 2) as churn_rate
FROM user_with_next_month
WHERE next_month IS NOT NULL
GROUP BY month
ORDER BY month DESC;

Интерпретация

Шкала здоровья:

  • 0-5% — отличное удержание
  • 5-10% — нормально для B2C
  • 10-20% — требуется улучшение
  • 20%+ — критическая ситуация

Для анализа:

  • Segmentize по когортам (когда установили)
  • По регионам и платформам
  • По уровню активности перед оттоком
SQL: Найти отток клиентов (Churn) | PrepBro