Как посчитать MAU в SQL

Проверь себя · 1/3разбор после ответа
Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице 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 в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать MAU в Telegram

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 дней скользящим окном» некорректно. Зафиксируйте одно определение и держитесь его.

Связанные темы

FAQ

MAU или DAU?

DAU берут для высокочастотных продуктов, куда заходят каждый день, — соцсети, мессенджеры. MAU — для среднечастотных, где нормальная сессия раз в неделю-две: e-commerce, банк, СМИ. Большинство продуктов считают обе метрики и смотрят на их отношение.

Календарный MAU или скользящий?

Календарный MAU удобен для отчётности по периодам — месяц к месяцу. Скользящее 30-дневное окно не проваливается на стыке месяцев и честнее показывает тренд. В дашборды обычно ставят обе версии, чтобы не путать одно с другим.

Что значит «активный»?

Единого определения нет, договоритесь в команде. Чаще всего активностью считают факт открытия приложения или сайта. Но «качественный MAU» считают строже — по ключевому событию вроде покупки или отправленного сообщения.

Как MAU соотносится с размером рынка?

Рынок раскладывают по воронке: TAM (весь потенциальный рынок) → SAM (доступный вам сегмент) → MAU (те, кого реально удержали активными). Отношение MAU к SAM показывает проникновение — какую долю достижимого рынка вы уже забрали.

MAU упал — что делать?

Разложите падение на три компонента: привлечение (стало меньше новых пользователей?), удержание (старые отваливаются быстрее?) и вовлечённость (тот же пользователь заходит реже?). У каждого своя причина и свои меры — сначала найдите, какой компонент просел, и чините именно его.