Это SQL-версия отчёта панели мониторинга для системы.
Данный отчёт панели мониторинга предоставляет ежедневное количество автоматических личных сообщений, отправленных системой.
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-01-01
SELECT
DATE(created_at) AS day,
COUNT(*) AS notifications_count
FROM topics
WHERE archetype = 'private_message'
AND subtype = 'system_message'
AND created_at BETWEEN :start_date AND :end_date
AND deleted_at IS NULL
AND user_id > 0
GROUP BY DATE(created_at)
ORDER BY day
Пояснение к SQL-запросу
Запрос работает путём извлечения данных из таблицы topics — конкретно тех записей, которые являются личными сообщениями для пользователей с подтипом system_message в заданный период времени. Давайте разберём его по частям:
- Параметры даты:
- Запрос принимает два параметра:
:start_dateи:end_date, определяющие диапазон дат для отчёта. Оба параметра даты принимают форматYYYY-MM-DD.
- Запрос принимает два параметра:
- SELECT: Запрос выбирает два поля:
DATE(created_at) AS day: Извлекает часть даты из временной меткиcreated_at, фактически группируя записи по дню их создания.COUNT(*) AS notifications_count: Подсчитывает общее количество сгенерированных системой ЛС для каждого дня.
- FROM: Указывает таблицу
topicsкак источник данных, содержащий записи всех тем, включая личные сообщения. - WHERE: Содержит несколько фильтров для сужения набора данных:
archetype = 'private_message': Включает только записи, являющиеся личными сообщениями.subtype = 'system_message': Дополнительно сужает выборку до сообщений, сгенерированных системой.created_at BETWEEN :start_date AND :end_date: Фильтрует ЛС, созданные в диапазоне, указанном параметрами.deleted_at IS NULL: Исключает сообщения, которые были удалены.user_id > 0: Гарантирует, что сообщения связаны с реальными учётными записями пользователей, а не с системой или анонимными аккаунтами.
- GROUP BY: Группирует результаты по дню их создания.
- ORDER BY: Сортирует итоговый набор результатов по дню в порядке возрастания, обеспечивая хронологическую последовательность ежедневных подсчётов.
Пример результатов
| day | notifications_count |
|---|---|
| 2024-01-01 | 5 |
| 2024-01-02 | 7 |
| 2024-01-03 | 11 |
| 2024-01-04 | 14 |
| 2024-01-05 | 8 |