← Назад к вопросам
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 по когортам (когда установили)
- По регионам и платформам
- По уровню активности перед оттоком