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

Это 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(ta.created_at) AS solution_date,
    COUNT(*) AS solution_count
  FROM discourse_solved_solved_topics st
  JOIN discourse_solved_topic_answers ta ON ta.solved_topic_id = st.id
  JOIN posts p ON p.id = ta.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(ta.created_at)
)

SELECT 
  solution_date,
  solution_count
FROM daily_solutions
ORDER BY solution_date

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

Этот запрос использует таблицу discourse_solved_solved_topics и таблицу discourse_solved_topic_answers, которая была добавлена в Discourse PR #39806.

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

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

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

день принятые_решения
2023-11-14 16
2023-11-15 5
2023-11-16 10
2023-11-17 4
2023-11-18 2
2 лайка