Как посчитать MAU в SQL
orders есть поля user_id, amount, status. Какой запрос корректен и наиболее эффективен?Содержание:
Зачем MAU
«Сколько у нас активных пользователей за месяц?» — самый частый вопрос менеджмента. Цифра звучит просто, но нюансов хватает: считать календарный месяц (1–30 апреля) или последние 30 дней скользящим окном? Включать ли регистрации, не закончившие онбординг? Что вообще считать активностью?
MAU — фундаментальная метрика для большинства продуктов. В статье — SQL и нюансы.
Что такое MAU
MAU (Monthly Active Users) — уникальные пользователи, совершившие минимум одно действие за период в месяц.
MAU = COUNT(DISTINCT user_id) where date ∈ месяцЧто считать активностью, определяет команда: открыл приложение или совершил ключевое событие — например, отправил сообщение, оформил заказ.
Базовый расчёт
Данные: events(user_id, event_date, event_type).
SELECT
DATE_TRUNC('month', event_date) AS month,
COUNT(DISTINCT user_id) AS mau
FROM events
WHERE event_date >= '2026-01-01'
AND event_date < '2026-05-01'
GROUP BY 1
ORDER BY 1;Важно: DATE_TRUNC('month', ...) группирует по календарному месяцу. Если месяц неполный — MAU занижен.
Calendar MAU vs Rolling 30-day
Calendar MAU
Активные за календарный месяц (1-30/31 числа). Простой и понятный.
Rolling 30-day MAU
Активные за последние 30 дней (катящееся окно). Не зависит от границ месяца, гладкая кривая.
WITH dates AS (
SELECT generate_series('2026-04-01'::DATE, '2026-04-30'::DATE, INTERVAL '1 day')::DATE AS day
)
SELECT
d.day,
COUNT(DISTINCT e.user_id) AS rolling_mau
FROM dates d
JOIN events e
ON e.event_date > d.day - INTERVAL '30 days'
AND e.event_date <= d.day
GROUP BY d.day
ORDER BY d.day;Rolling MAU не имеет «провалов» на стыке месяцев и лучше для долгосрочных трендов.
MAU по сегментам
SELECT
DATE_TRUNC('month', e.event_date) AS month,
u.acquisition_channel,
COUNT(DISTINCT e.user_id) AS mau
FROM events e
JOIN users u ON u.user_id = e.user_id
WHERE e.event_date >= '2026-01-01'
GROUP BY 1, 2
ORDER BY 1, mau DESC;Или по типу события:
SELECT
DATE_TRUNC('month', event_date) AS month,
COUNT(DISTINCT user_id) AS open_app_mau,
COUNT(DISTINCT CASE WHEN event_type = 'purchase' THEN user_id END) AS purchase_mau
FROM events
WHERE event_date >= '2026-01-01'
GROUP BY 1;«Качественный MAU» (по ключевому событию) обычно меньше общего MAU.
Частые ошибки
Ошибка 1. Считать неполный месяц. 13 мая 2026 — MAU за май неполный. Используйте month-to-date.
Ошибка 2. Дубли user_id.
Если в events user_id записан с пробелами / разными регистрами — DISTINCT не сработает. Нормализуйте.
Ошибка 3. Включать ботов.
Без фильтра is_bot = false MAU завышен. В мобильных приложениях особенно — тестовые установки, эмуляторы.
Ошибка 4. Часовой пояс.
DATE_TRUNC в UTC даёт MAU «по UTC». Для МСК-продукта приведите время к нужной зоне: event_date AT TIME ZONE 'Europe/Moscow'.
Ошибка 5. Путаница с уникальными пользователями за период. «Уникальные пользователи за квартал» ≠ MAU × 3. Пользователь мог быть активен один раз за весь квартал — тогда в квартальном итоге он считается один раз, но попал бы в MAU каждого месяца, будь он активен в каждом из них.
Ошибка 6. Календарный и скользящий вперемешку. Сравнение «MAU апреля по календарю» с «MAU за последние 30 дней скользящим окном» некорректно. Зафиксируйте одно определение и держитесь его.
Связанные темы
- Как посчитать DAU в SQL
- Stickiness и DAU/MAU ratio
- Как посчитать active days в SQL
- Метрики продукта DAU/MAU/ARPU
FAQ
MAU или DAU?
DAU берут для высокочастотных продуктов, куда заходят каждый день, — соцсети, мессенджеры. MAU — для среднечастотных, где нормальная сессия раз в неделю-две: e-commerce, банк, СМИ. Большинство продуктов считают обе метрики и смотрят на их отношение.
Календарный MAU или скользящий?
Календарный MAU удобен для отчётности по периодам — месяц к месяцу. Скользящее 30-дневное окно не проваливается на стыке месяцев и честнее показывает тренд. В дашборды обычно ставят обе версии, чтобы не путать одно с другим.
Что значит «активный»?
Единого определения нет, договоритесь в команде. Чаще всего активностью считают факт открытия приложения или сайта. Но «качественный MAU» считают строже — по ключевому событию вроде покупки или отправленного сообщения.
Как MAU соотносится с размером рынка?
Рынок раскладывают по воронке: TAM (весь потенциальный рынок) → SAM (доступный вам сегмент) → MAU (те, кого реально удержали активными). Отношение MAU к SAM показывает проникновение — какую долю достижимого рынка вы уже забрали.
MAU упал — что делать?
Разложите падение на три компонента: привлечение (стало меньше новых пользователей?), удержание (старые отваливаются быстрее?) и вовлечённость (тот же пользователь заходит реже?). У каждого своя причина и свои меры — сначала найдите, какой компонент просел, и чините именно его.