이것은 채택된 솔루션에 대한 대시보드 리포트의 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 PR #39806에서 도입된 discourse_solved_topic_answers 테이블을 사용합니다.
- 파라미터: 이 쿼리는 다음을 허용합니다:
- 기본값이 있는
YYYY-MM-DD형식의:start_date및:end_date파라미터 - 특정 범주로 필터링하기 위한 선택적
:category_id
- 기본값이 있는
- 공용 테이블 표현식(CTE): 로직을 정리하기 위해
daily_solutions라는 이름의 CTE를 사용합니다. - 조인(Joins):
posts- 솔루션 게시물이 여전히 존재하고 삭제되지 않았는지 확인topics- 토픽이 존재하고, 개인 메시지가 아니며, 삭제되지 않았는지 확인users- 솔루션 게시자가 유효한 사용자인지 확인
- 필터링:
WHERE절은 다음을 수행합니다:- 지정된 날짜 범위로 제한
- 사용자가 활성 상태이고, 침묵(silenced)되지 않았으며, 정지(suspended)되지 않았는지 확인
- 선택적 카테고리 필터링 허용
- 그룹핑 및 정렬: 날짜별로 그룹화하고 시간 순으로 정렬
이 쿼리의 출력은 각 날짜에 솔루션으로 표시된 게시물 수와 해당 날짜의 목록입니다.
결과 예시
| 날짜 | 채택된_솔루션 |
|---|---|
| 2023-11-14 | 16 |
| 2023-11-15 | 5 |
| 2023-11-16 | 10 |
| 2023-11-17 | 4 |
| 2023-11-18 | 2 |
| … | … |