← Назад к вопросам
SQL: Расчет ARPU по источникам трафика
2.0 Middle🔥 161 комментариев
#SQL и базы данных#Атрибуция и маркетинг
Условие
У вас есть таблица users:
- user_id (integer)
- registration_date (date)
- traffic_source (varchar)
И таблица payments:
- payment_id (integer)
- user_id (integer)
- amount (decimal)
- payment_date (date)
Посчитайте ARPU (Average Revenue Per User) по источникам трафика.
Ожидаемый результат:
Таблица с колонками: traffic_source, users_count, total_revenue, arpu
Источник: задача для маркетинговой аналитики
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
SQL: Расчет ARPU по источникам трафика
Базовый расчет ARPU
SELECT
u.traffic_source,
COUNT(DISTINCT u.user_id) as users_count,
ROUND(SUM(p.amount), 2) as total_revenue,
ROUND(SUM(p.amount) / COUNT(DISTINCT u.user_id), 2) as arpu
FROM users u
LEFT JOIN payments p ON u.user_id = p.user_id
GROUP BY u.traffic_source
ORDER BY arpu DESC;
С учетом конверсии платящих пользователей
SELECT
u.traffic_source,
COUNT(DISTINCT u.user_id) as total_users,
COUNT(DISTINCT p.user_id) as paying_users,
ROUND(100.0 * COUNT(DISTINCT p.user_id) / COUNT(DISTINCT u.user_id), 2) as conversion_pct,
ROUND(SUM(COALESCE(p.amount, 0)), 2) as total_revenue,
ROUND(SUM(COALESCE(p.amount, 0)) / COUNT(DISTINCT u.user_id), 2) as arpu,
ROUND(SUM(COALESCE(p.amount, 0)) / COUNT(DISTINCT p.user_id), 2) as arppu
FROM users u
LEFT JOIN payments p ON u.user_id = p.user_id
GROUP BY u.traffic_source
ORDER BY arpu DESC;
Метрики:
- ARPU = Revenue / All Users (включая неплатящих)
- ARPPU = Revenue / Paying Users (только платящие)
- Conversion % = Paying Users / Total Users
По когортам (месяцы регистрации)
SELECT
u.traffic_source,
DATE_TRUNC(u.registration_date, MONTH) as signup_month,
COUNT(DISTINCT u.user_id) as users_count,
ROUND(SUM(p.amount), 2) as total_revenue,
ROUND(SUM(p.amount) / COUNT(DISTINCT u.user_id), 2) as arpu
FROM users u
LEFT JOIN payments p ON u.user_id = p.user_id
GROUP BY u.traffic_source, DATE_TRUNC(u.registration_date, MONTH)
ORDER BY signup_month DESC, arpu DESC;
Анализ по типам пользователей
WITH user_stats AS (
SELECT u.user_id, u.traffic_source, COUNT(p.payment_id) as payment_count, SUM(p.amount) as user_revenue
FROM users u
LEFT JOIN payments p ON u.user_id = p.user_id
GROUP BY u.user_id, u.traffic_source
)
SELECT
traffic_source,
COUNT(*) as total_users,
SUM(CASE WHEN payment_count = 0 THEN 1 ELSE 0 END) as non_payers,
SUM(CASE WHEN payment_count = 1 THEN 1 ELSE 0 END) as one_time,
SUM(CASE WHEN payment_count > 1 THEN 1 ELSE 0 END) as repeat,
ROUND(SUM(COALESCE(user_revenue, 0)), 2) as total_revenue,
ROUND(SUM(COALESCE(user_revenue, 0)) / COUNT(*), 2) as arpu
FROM user_stats
GROUP BY traffic_source
ORDER BY arpu DESC;
Интерпретация
Высокий ARPU означает:
- Качественный трафик
- Пользователи с высокой платежеспособностью
- Эффективная монетизация
Низкий ARPU означает:
- Неправильный таргетинг
- Нужна оптимизация воронки
- Проблемы с качеством трафика
Правило прибыльности: ARPU должен быть > CAC (Customer Acquisition Cost)