Как посчитать ARR в SQL
dt, platform, dau. Нужно вывести значение dau за предыдущий день для той же платформы, чтобы посчитать дневное изменение. Какое выражение верное?Содержание:
Что такое ARR
ARR (Annual Recurring Revenue) — годовая повторяющаяся выручка. Оценка того, сколько компания заработает за следующие 12 месяцев при условии, что текущий состав подписок не изменится.
ARR — главная метрика SaaS. По нему оценивают компании, считают их стоимость, ставят квартальные цели. На собесе аналитика SaaS ARR спрашивают вместе с MRR.
Формула
ARR = MRR × 12Или эквивалентно:
ARR = SUM(annual_subscriptions) + SUM(monthly_subscriptions × 12)Если все подписки месячные — формула простая. Если есть годовые и многолетние — нужно нормализовать к году.
SQL: текущий ARR
Допустим, есть таблица subscriptions с активными подписками и их MRR-вкладом:
-- subscriptions: customer_id, mrr, status, created_at, cancelled_at
SELECT SUM(mrr) * 12 AS arr
FROM subscriptions
WHERE status = 'active';Если в таблице есть годовые подписки с полем billing_period:
SELECT
SUM(
CASE
WHEN billing_period = 'monthly' THEN amount * 12
WHEN billing_period = 'annual' THEN amount
WHEN billing_period = 'biennial' THEN amount / 2
ELSE 0
END
) AS arr
FROM subscriptions
WHERE status = 'active';SQL: ARR-curve по дням
Если хотите видеть, как ARR менялся со временем — нужна таблица событий подписок.
-- subscription_events: customer_id, event_date, mrr_change
WITH days AS (
SELECT generate_series('2026-01-01'::DATE, CURRENT_DATE, INTERVAL '1 day')::DATE AS day
),
events AS (
SELECT
event_date::DATE AS day,
SUM(mrr_change) AS daily_change
FROM subscription_events
GROUP BY 1
)
SELECT
d.day,
SUM(COALESCE(e.daily_change, 0)) OVER (ORDER BY d.day) * 12 AS arr
FROM days d
LEFT JOIN events e USING (day)
ORDER BY d.day;SUM(...) OVER (ORDER BY day) — это нарастающий итог. Без него получите дельту за день, а не накопленный ARR.
Что включать в ARR
ARR должен включать только повторяющиеся компоненты выручки:
- Плата за подписку — да
- Разовая плата за подключение (setup fee) — нет
- Плата за апгрейд — нет, если она разовая
- Услуги внедрения — нет
- Доп. опции (add-ons) по подписке — да
На собесе спросят: «У клиента выручка $1200 — $1000 подписка + $200 разовая плата за подключение. Какой его вклад в ARR?» Ответ: $1000 × 12 = $12 000 (только подписка).
Частые ошибки
Считать ARR от выручки. Выручка — это все деньги, которые пришли. ARR — нормализованная регулярная часть. Включение разовой выручки даёт завышенный ARR.
Не учитывать отток. Если клиент отменил подписку 3 дня назад — он не должен входить в текущий ARR.
Использовать сырые дельты MRR без сглаживания. Один большой клиент → ARR прыгнул. Используйте скользящие окна для трендов.
Путать ARR и Run-rate revenue. ARR считает по подпискам на сегодня. Run-rate = текущий месяц × 12. Run-rate включает разовую выручку, ARR — нет.
Целочисленное деление. SUM(amount) / 2 для двухлетних подписок → если amount целочисленный, получите усечение. Используйте NUMERIC или 1.0 *.
FAQ
ARR vs MRR — какой использовать?
MRR удобнее для оперативного, помесячного управления — это KPI команд роста. ARR берут для квартального и годового планирования, оценки стоимости компании и отчётов для совета директоров. На собесе SaaS-аналитика спрашивают обе метрики, так что знать нужно и ту, и другую.
Что считать «активной» подпиской?
Единого правила нет — зависит от компании. Обычно в ARR берут статусы active и past_due (платёж задерживается, но клиент подписку не отменял). А cancelled, expired и paused в активные не входят и в ARR не попадают.
Это официальная информация?
Нет. Статья основана на индустриальных практиках SaaS-аналитики.