-- [params]
-- int :likes_received
-- int :posts_read
SELECT
us.user_id,
us.likes_received,
us.posts_read_count
FROM user_stats us
JOIN users u on u.id = us.user_id
WHERE u.last_posted_at > CURRENT_DATE - INTERVAL '1 YEAR'
AND us.likes_received >= :likes_received
AND us.posts_read_count >= :posts_read
ORDER BY 2 DESC, 3 DESC
좋아요와 게시물 읽음 수는 전체 기간 기준입니다(첫 번째는 단순 게시물이 아닌 좋은 기여도를 중시하기 위함이고, 두 번째는 이를 균형 있게 조정하기 위함입니다).
게시물 최소 수치는 지난 1년 내 기준으로만 적용되며, 이는 멤버들이 여전히 꾸준히 활동 중인지 파악하기 위한 파라미터입니다.
좋은 방법일 수 있지만, 제 경우에는 TL1, TL2, TL3을 크게 수정해야 하며 아래 제한 사항을 고려해야 합니다.
죄송하지만 이해가 되지 않습니다. 배지를 사용해야 하나요?
음, 위의 쿼리를 어떻게 수정해야 배지에 삽입할 수 있나요?
-- [params]
-- int :likes_received
-- int :posts_read
WITH user_activity AS (
SELECT
p.user_id,
COUNT(p.id) as posts_count
FROM posts p
LEFT JOIN topics t ON t.id = p.topic_id
WHERE p.created_at::date >= CURRENT_DATE - INTERVAL '1 YEAR'
AND t.deleted_at IS NULL
AND p.deleted_at IS NULL
AND t.archetype = 'regular'
GROUP BY 1
)
SELECT
us.user_id,
us.likes_received,
us.posts_read_count,
ua.posts_count
FROM user_stats us
JOIN user_activity ua ON UA.user_id = us.user_id
WHERE us.likes_received >= :likes_received
AND us.posts_read_count >= :posts_read
AND ua.posts_count >= 10
ORDER BY 2 DESC, 3 DESC, 4 DESC
그리고 이를 조정하거나 사용자 이름만 남기도록 단순화하면, 결과를 CSV로 내보내고(예: 메모장 같은 프로그램으로 열면) 그룹 페이지의 ‘Add Users’ 상자에 복사하여 붙여넣을 수 있는 목록을 얻을 수 있습니다:
-- [params]
-- int :likes_received
-- int :posts_read
WITH user_activity AS (
SELECT
p.user_id,
COUNT(p.id) as posts_count
FROM posts p
LEFT JOIN topics t ON t.id = p.topic_id
WHERE p.created_at::date >= CURRENT_DATE - INTERVAL '1 YEAR'
AND t.deleted_at IS NULL
AND p.deleted_at IS NULL
AND t.archetype = 'regular'
GROUP BY 1
)
SELECT
u.username
FROM user_stats us
JOIN user_activity ua ON UA.user_id = us.user_id
JOIN users u ON u.id = us.user_id
WHERE us.likes_received >= :likes_received
AND us.posts_read_count >= :posts_read
AND ua.posts_count >= 10
ORDER BY 1
이들을 병합하고 개선했습니다 (제 부족한 SQL 실력으로요). 사용자명이 필요할 때는 CSV를 다운로드해서 사용자名列을 복사/붙여넣기 하면 됩니다.
likes_received_max를 추가해서 그룹을 나눌 수 있게 했습니다. 위의 그룹은 제외됩니다.
예를 들어 first_steps: 5개의 좋아요 (<30), 500개 게시글 읽음, 지난 1년간 5개 이상의 게시글 작성, beginners: 30개의 좋아요 (<100), 1000개 게시글 읽음, 지난 1년간 10개 이상의 게시글 작성 padawan: 100개의 좋아요, 2000개 게시글 읽음, 지난 1년간 10개 이상의 게시글 작성 hero: 200개의 좋아요, 5000개 게시글 읽음, 지난 1년간 10개 이상의 게시글 작성
-- [params]
-- int :likes_received
-- int :posts_read
-- int :likes_received_max
-- int :posts_count
WITH user_activity AS (
SELECT
p.user_id,
COUNT(p.id) as posts_count
FROM posts p
LEFT JOIN topics t ON t.id = p.topic_id
WHERE p.created_at::date >= CURRENT_DATE - INTERVAL '1 YEAR'
AND t.deleted_at IS NULL
AND p.deleted_at IS NULL
AND t.archetype = 'regular'
GROUP BY 1
)
SELECT
us.user_id,
u.username,
us.likes_received,
us.posts_read_count,
ua.posts_count,
u.title
FROM user_stats us
JOIN user_activity ua ON UA.user_id = us.user_id
JOIN users u ON u.id = us.user_id
WHERE us.likes_received >= :likes_received
AND us.posts_read_count >= :posts_read
AND ua.posts_count >= :posts_count
AND us.likes_received < :likes_received_max
ORDER BY 2 ASC, 3 ASC, 4 ASC