대시보드 보고서 - 채택된 답변

이것은 채택된 솔루션에 대한 대시보드 리포트의 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
… …
2개의 좋아요