이것은 게시물에 대한 대시보드 리포트의 SQL 버전입니다.
이 리포트는 지정된 날짜 범위 내에서 생성된 게시물의 일별 수를 제공합니다. 이는 사적인 메시지 및 기타 특수 아키타입의 게시물을 제외하고 일반 토픽의 활동을 추적하도록 설계되었습니다.
--[params]
-- date :start_date
-- date :end_date
SELECT
p.created_at::date AS "Day",
COUNT(p.id) AS "Count"
FROM posts p
INNER JOIN topics t ON t.id = p.topic_id AND t.deleted_at ISNULL
WHERE p.created_at::date BETWEEN :start_date AND :end_date
AND p.deleted_at ISNULL
AND t.archetype = 'regular'
AND p.post_type = 1
GROUP BY p.created_at::date
ORDER BY 1
SQL 쿼리 설명
- 파라미터:
- 쿼리는 리포트의 날짜 범위를 정의하는 두 개의 파라미터인
:start_date와:end_date를 받습니다. 두 날짜 파라미터 모두YYYY-MM-DD형식의 날짜를 받아들입니다.
- 쿼리는 리포트의 날짜 범위를 정의하는 두 개의 파라미터인
SQL 쿼리는 다음 작업을 수행합니다:
- 데이터 선택:
- 각 게시물이 생성된 날짜(
created_at::date)를 선택하고 시간 요소를 무시하기 위해 날짜 형식으로 변환합니다. - 또한 각 날짜에 생성된 게시물의 수(
COUNT(p.id))를 계산합니다.
- 각 게시물이 생성된 날짜(
- 조인:
- 쿼리는
INNER JOIN을 사용하여posts테이블을topics테이블과 조인합니다. 이 조인은 기존 토픽과 연결된 게시물만 고려되도록 보장합니다. - 삭제된 토픽(
t.deleted_at ISNULL)은 필터링하여 제외합니다.
- 쿼리는
- 필터:
- 지정된 날짜 범위(
p.created_at::date BETWEEN :start_date AND :end_date) 내의 게시물만 포함하도록 필터링합니다. - 삭제된 게시물(
p.deleted_at ISNULL)을 제외합니다. - 결과를 일반 토픽(
t.archetype = 'regular')의 게시물로 제한합니다. p.post_type = 1인 게시물만 고려하며, 관리자 작업, 속삭임(whispers), small_action 게시물을 제외합니다.
- 지정된 날짜 범위(
- 그룹핑 및 정렬:
- 결과는 게시물 생성 날짜(
GROUP BY p.created_at::date) 기준으로 그룹화됩니다. - 최종 출력은 날짜의 오름차순(
ORDER BY 1)으로 정렬되며, 여기서1은SELECT문장의 첫 번째 열인 날짜를 가리킵니다.
- 결과는 게시물 생성 날짜(
결과 예시
| 날짜 | 개수 |
|---|---|
| 2023-11-12 | 25 |
| 2023-11-13 | 35 |
| 2023-11-14 | 38 |
| 2023-11-15 | 47 |
| 2023-11-16 | 36 |
| 2023-11-17 | 79 |
| … | … |