Это 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 |
| … | … |