배지 자격 요건 확인

Aficionado(100일 연속) 배지에 대한 질문을 많이 받습니다. 보통 문제는 사용자가 자신의 지역과 서버 시간 사이의 시간대 차이로 인해 하루 이상을 놓쳤기 때문입니다.

배지 지급에 사용되는 쿼리는 항상 조금 혼란스러웠습니다. 이제 이해가 가는 것 같습니다. 여기 유사한 논리를 사용하는 Data Explorer 쿼리가 있습니다. 이는 사용자의 연속 방문 기간을 반환합니다. 각 연속 방문 기간에 대해 시작 날짜, 연속 일 수, 종료 날짜를 반환합니다. 기본적으로 10회 이상의 방문이 있는 모든 기간을 반환합니다. 사용자가 놓친 날짜를 찾으려면 min_days 매개변수를 1로 설정하십시오.

결과 첫 번째 행에서 반환되는 period_end 값이 쿼리를 실행하는 현재 날짜와 같다면, 해당 사용자는 아직 배지 획득 가능성이 남아 있습니다.

--[params]
-- string :username
-- int :min_days = 10

WITH consecutive_visits AS (
  SELECT user_id,
       visited_at,
       -- s 값은 각 연속 날짜 그룹에서 동일합니다
       visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s
    FROM user_visits
    WHERE user_id = (SELECT id FROM users WHERE username = :username)
)

SELECT
MIN(visited_at) period_start,
COUNT(*) AS consecutive_days,
MAX(visited_at) period_end
FROM consecutive_visits
GROUP BY user_id, s
HAVING COUNT(*) >= :min_days
ORDER BY period_start DESC