열거한 입력값이 원하는 출력값과 일치하지 않는 것 같습니다. 단일 사용자의 데이터를 가져오려면 아래 쿼리를 시작점으로 사용할 수 있습니다. 이 쿼리는 공통 테이블 표현식(CTE)을 사용하여 쿼리를 읽고 작성하기 쉽게 만듭니다. 동일한 패턴을 따라 결과에 더 많은 데이터를 추가할 수도 있습니다.
확신이 서지 않는 점은 특정 날짜에 대한 데이터의 합계를 원하는지, 아니면 각 날짜에 발생한 작업의 수를 원하는지입니다. 예를 들어, 2019-10-31에 해당 사용자가 사이트 가입日以来 전체 기간 동안 총 20개의 게시글을 작성했는지 알고 싶은 건지, 아니면 2019-10-31에 해당 사용자가 정확히 3개의 게시글을 작성했는지 알고 싶은 건지입니다. 현재 쿼리의 구조상 후자의 결과를 반환합니다.
--[params]
-- string :username
-- date :start_date
WITH target_user AS (SELECT id FROM users WHERE username = :username),
days AS (
SELECT day::date
FROM GENERATE_SERIES(:start_date, NOW()::date, INTERVAL '1 day') AS day
),
topics_created AS(
SELECT
tu.id,
day,
COUNT(tu.id) AS topics
FROM topics t
JOIN target_user tu
ON tu.id = t.user_id
JOIN days
ON t.created_at::date = day
WHERE t.archetype = 'regular'
AND t.deleted_at IS NULL
GROUP BY day, tu.id
),
posts_created AS(
SELECT
tu.id,
day,
COUNT(tu.id) AS posts,
SUM(array_length(regexp_split_to_array(raw, '\s'), 1)) AS word_count
FROM posts p
JOIN target_user tu
ON tu.id = p.user_id
JOIN days
ON p.created_at::date = day
WHERE p.post_type = 1
AND p.deleted_at IS NULL
GROUP BY day, tu.id
),
likes_received AS (
SELECT tu.id,
day,
COUNT(tu.id) AS likes_received_count
FROM user_actions ua
JOIN target_user tu
ON tu.id = ua.user_id
JOIN days
ON ua.created_at::date = day
WHERE ua.action_type = 2
GROUP BY day, tu.id
)
SELECT
d.day,
COALESCE(topics, 0) AS topics,
COALESCE(posts, 0) AS posts,
COALESCE(word_count, 0) AS word_count,
COALESCE(likes_received_count, 0) AS likes_received
FROM days d
LEFT JOIN topics_created tc
ON tc.day = d.day
LEFT JOIN posts_created pc
ON pc.day = d.day
LEFT JOIN likes_received lc
ON lc.day = d.day
ORDER BY d.day