Отчет по панели управления: принятые решения

Это SQL-версия отчёта панели управления по принятым решениям.

Данный отчёт предоставляет количество сообщений, отмеченных как решения, в разрезе дней в пределах указанного диапазона дат. Он полезен для понимания того, как часто пользователи находят ответы на свои вопросы и отмечают их как решения с течением времени.

-- [params]
-- date :start_date = 2025-03-01
-- date :end_date = 2025-04-01
-- null category_id :category_id

WITH daily_solutions AS (
  SELECT 
    DATE(st.created_at) AS solution_date,
    COUNT(*) AS solution_count
  FROM discourse_solved_solved_topics st
  JOIN posts p ON p.id = st.answer_post_id AND p.deleted_at IS NULL
  JOIN topics t ON t.id = st.topic_id 
                AND t.archetype <> 'private_message'
                AND t.deleted_at IS NULL
                AND (:category_id IS NULL OR t.category_id = :category_id)
  JOIN users u ON u.id = p.user_id
  WHERE 
    st.created_at BETWEEN :start_date AND :end_date
    AND u.id > 0
    AND u.active
    AND u.silenced_till IS NULL
    AND u.suspended_till IS NULL
  GROUP BY DATE(st.created_at)
)

SELECT 
  solution_date,
  solution_count
FROM daily_solutions
ORDER BY solution_date

Пояснение к SQL-запросу

Этот запрос использует таблицу discourse_solved_solved_topics, введённую в discourse-solved PR #352:

  • Параметры: Запрос принимает:
    • Параметры :start_date и :end_date в формате ГГГГ-ММ-ДД со значениями по умолчанию
    • Необязательный :category_id для фильтрации по конкретной категории
  • Общее табличное выражение (CTE): Использует CTE с именем daily_solutions для организации логики
  • Соединения (Joins):
    • posts — гарантирует, что сообщение с решением всё ещё существует и не удалено
    • topics — гарантирует, что тема существует, не является личным сообщением и не удалена
    • users — проверяет, что автор решения является действительным пользователем
  • Фильтрация: В предложении WHERE:
    • Ограничивает запрос указанным диапазоном дат
    • Гарантирует, что пользователи активны, не заглушены и не приостановлены
    • Позволяет необязательную фильтрацию по категории
  • Группировка и сортировка: Группирует по дате и сортирует в хронологическом порядке

Результатом выполнения этого запроса будет список дат с соответствующим количеством сообщений, отмеченных как решения в каждый из этих дней.

Пример результатов

день accepted_solutions
2023-11-14 16
2023-11-15 5
2023-11-16 10
2023-11-17 4
2023-11-18 2
2 лайка