Это SQL-версия отчета панели управления для новых участников.
Этот SQL-отчет панели управления предназначен для предоставления администраторам четкого обзора вовлеченности пользователей на их форуме Discourse путем определения количества пользователей, сделавших свой первый пост в каждый день в пределах указанного диапазона дат.
-- [params]
-- date :start_date = 2023-12-15
-- date :end_date = 2024-01-16
SELECT
date_trunc('day', p.created_at)::date AS day,
COUNT(DISTINCT p.user_id) AS new_contributors
FROM
posts p
INNER JOIN (
SELECT
user_id,
MIN(created_at) as first_post_date
FROM
posts
WHERE deleted_at IS NULL
GROUP BY
user_id
) fp ON p.user_id = fp.user_id
WHERE
p.created_at = fp.first_post_date
AND p.created_at BETWEEN :start_date AND (:end_date::date + 1)
GROUP BY
day
ORDER BY
day
Объяснение SQL-запроса
Отчет получает количество уникальных пользователей, сделавших свой первый пост в каждый день в пределах указанного диапазона дат. Это достигается путем выполнения следующих шагов:
Параметры:
- Запрос принимает два параметра:
:start_dateи:end_date, которые определяют диапазон дат для отчета. Оба параметра даты принимают формат датыYYYY-MM-DD.
Вложенный запрос: Определение даты первого поста для каждого пользователя
Этот отчет содержит подзапрос, который выбирает два столбца из таблицы posts: user_id и самую раннюю временную метку created_at (алиас first_post_date). Самая ранняя временная метка created_at представляет собой первый пост пользователя. Этот подзапрос включает условие WHERE, которое учитывает только посты, которые не были удалены (deleted_at IS NULL). Наконец, результаты группируются по user_id, чтобы гарантировать, что мы рассматриваем только первый пост каждого пользователя.
Основной запрос: Подсчет пользователей, сделавших свой первый пост
Основной запрос выполняет следующие операции:
- JOIN: Основная таблица
posts(алиасp) соединяется с результатом подзапроса (алиасfp) поuser_id, чтобы сопоставить каждый пост с первым постом соответствующего пользователя. - Фильтрация по дате: Подраздел
WHEREвключает два условия — он сравнивает временную меткуcreated_atкаждого поста сfirst_post_dateиз подзапроса, чтобы убедиться, что мы имеем дело только с первыми постами, и проверяет, что временная меткаcreated_atпопадает в указанный диапазон дат, включаяend_date(+1 день для полного включения последнего дня). - Агрегация: Затем посты группируются по дате, усеченной до дня без временной компоненты (
date_trunc('day', p.created_at)::date), что позволяет подсчитать уникальных пользователей, сделавших первый пост в каждый день. - Подсчет: Используя
COUNT(DISTINCT p.user_id), мы получаем количество уникальных пользователей, сделавших свой первый пост в каждый соответствующий день. - Сортировка: Результаты сортируются по дате в порядке возрастания (
ORDER BY day), чтобы обеспечить хронологический обзор вовлеченности пользователей.
Итоговый вывод
Итоговый отчет состоит из двух столбцов:
day: Дата вовлеченности пользователей без временной компоненты.new_contributors: Количество уникальных пользователей, сделавших свой первый пост на форуме в каждый день.
Пример результатов
| day | new_contributors |
|---|---|
| 2023-12-15 | 16 |
| 2023-12-16 | 8 |
| 2023-12-17 | 7 |
| 2023-12-18 | 19 |
| 2023-12-19 | 15 |