Расчёт MAU (Monthly Active Users)
Условие
Дана таблица clients со следующей структурой:
- client_id (INT) — идентификатор клиента
- activity_date (DATE) — дата активности
- app_name (VARCHAR) — название приложения
Напишите SQL-запрос для расчета MAU (Monthly Active Users) — количества уникальных активных пользователей приложения в месяц, усреднённого по всем месяцам.
Требования
- Учитывать только уникальных пользователей за каждый месяц
- Вывести среднее значение по всем месяцам
Пример данных
| client_id | activity_date | app_name |
|---|---|---|
| 1 | 2024-01-05 | mobile |
| 1 | 2024-01-10 | mobile |
| 2 | 2024-01-15 | mobile |
| 1 | 2024-02-01 | mobile |
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
MAU (Monthly Active Users) — это ключевая метрика для анализа активности приложения. Задача состоит из двух частей: сначала найти уникальных пользователей за каждый месяц, а затем вычислить среднее значение по всем месяцам.
Подход к решению
Этап 1: Группируем данные по месяцам и считаем уникальных пользователей в каждом месяце.
Этап 2: Вычисляем среднее значение MAU по всем месяцам.
SQL-запрос
WITH monthly_users AS (
SELECT
DATE_TRUNC(month, activity_date) AS month,
COUNT(DISTINCT client_id) AS mau
FROM clients
GROUP BY DATE_TRUNC(month, activity_date)
)
SELECT
ROUND(AVG(mau)::NUMERIC, 2) AS average_mau
FROM monthly_users;
Альтернативный вариант (для MySQL/SQLite)
Если используется MySQL или SQLite, можно применить функцию DATE_FORMAT:
WITH monthly_users AS (
SELECT
DATE_FORMAT(activity_date, %Y-%m) AS month,
COUNT(DISTINCT client_id) AS mau
FROM clients
GROUP BY DATE_FORMAT(activity_date, %Y-%m)
)
SELECT
ROUND(AVG(mau), 2) AS average_mau
FROM monthly_users;
Пошаговое объяснение
1. CTE (Common Table Expression) monthly_users
DATE_TRUNC(month, activity_date)— приводит все даты в месяце к первому дню месяца для группировкиCOUNT(DISTINCT client_id)— считает уникальных клиентов (ключевой момент!)GROUP BY DATE_TRUNC(...)— группирует по месяцам
2. Основной запрос
AVG(mau)— вычисляет среднее значение MAU по всем месяцамROUND(..., 2)— округляет до двух знаков после запятой::NUMERIC(PostgreSQL) — для корректного округления
Пример выполнения на данных из условия
Исходные данные:
- Январь 2024: client_id 1, 2 → MAU = 2
- Февраль 2024: client_id 1 → MAU = 1
Результат: (2 + 1) / 2 = 1.50 средний MAU
Важные моменты
✓ DISTINCT — критически важен для подсчёта уникальных пользователей. Если один пользователь посещает приложение несколько раз в месяц, считаем его один раз
✓ Группировка по месяцам — используем DATE_TRUNC или DATE_FORMAT в зависимости от СУБД
✓ Средний MAU — позволяет оценить типичное количество активных пользователей в месяц
✓ Настройка по app_name — если нужно, можно добавить WHERE app_name = mobile или групировать по приложениям:
WITH monthly_users AS (
SELECT
app_name,
DATE_TRUNC(month, activity_date) AS month,
COUNT(DISTINCT client_id) AS mau
FROM clients
GROUP BY app_name, DATE_TRUNC(month, activity_date)
)
SELECT
app_name,
ROUND(AVG(mau)::NUMERIC, 2) AS average_mau
FROM monthly_users
GROUP BY app_name;
Это позволит отследить MAU отдельно по каждому приложению.