30일 방문 배지

10일 또는 365일 연속으로 포럼을 방문한 사용자에게 주어지는 배지가 존재한다는 것을 확인했습니다. 하지만 저는 30일 연속으로 포럼을 방문한 사람에게 자동으로 수여되는 배지를 제 포럼에 만들고 싶습니다.

특히 SQL 쿼리를 얻는 것이 가장 중요합니다.

참고로, Data Explorer를 사용하여 기존 쿼리를 찾을 수 있습니다.

예: SELECT * from badges WHERE query LIKE '%10 days%'

365일용 쿼리는 다음과 같습니다:

WITH consecutive_visits AS ( SELECT user_id , visited_at , visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s FROM user_visits ), visits AS ( SELECT user_id , MIN(visited_at) "start" , DENSE_RANK() OVER (PARTITION BY user_id ORDER BY s) "rank" FROM consecutive_visits GROUP BY user_id, s HAVING COUNT(*) >= 365 ) SELECT user_id , "start" + interval '365 days' "granted_at" FROM visits WHERE "rank" = 1

그리고 10일용 쿼리는:

WITH consecutive_visits AS ( SELECT user_id , visited_at , visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s FROM user_visits ), visits AS ( SELECT user_id , MIN(visited_at) "start" , DENSE_RANK() OVER (PARTITION BY user_id ORDER BY s) "rank" FROM consecutive_visits GROUP BY user_id, s HAVING COUNT(*) >= 10 ) SELECT user_id , "start" + interval '10 days' "granted_at" FROM visits WHERE "rank" = 1

따라서 30일용 쿼리는 아래처럼 하면 될 것 같습니다:

WITH consecutive_visits AS ( SELECT user_id , visited_at , visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s FROM user_visits ), visits AS ( SELECT user_id , MIN(visited_at) "start" , DENSE_RANK() OVER (PARTITION BY user_id ORDER BY s) "rank" FROM consecutive_visits GROUP BY user_id, s HAVING COUNT(*) >= 30 ) SELECT user_id , "start" + interval '30 days' "granted_at" FROM visits WHERE "rank" = 1

… 실행해 보니 정상적으로 동작하고 결과도 합리적으로 보이긴 하지만, 결과를 면밀히 확인해 보지는 않았습니다 :sweat_smile:

정말 감사합니다.

@merefield

코드를 복사하려고 해봤는데, 복사 기능이 막혀 있는 것 같아요. 다시 한번 감사드립니다. :heart:

막히셨나요? 무슨 뜻이신가요? (제 스페인어가 서투른 점 양해 부탁드립니다) 방금 확인해 보니 정상적으로 작동합니다. 필수 항목이 모두 입력되었는지, 그리고 위에 검증 오류가 없는지 확인해 보세요. 저장(Saves)을 누르면 왼쪽 목록 하단에 새 배지가 표시되어야 합니다. SQL 아래에 있는 링크를 사용하여 결과를 미리 볼 수도 있습니다.

10일을 참조하는 배지의 SQL을 포럼에서 복사해서 30일로 바꾸려고 했는데, 복사가 되지 않았습니다. 하지만 님의 도움 덕분에 제가 원하는 배지를 만들 수 있었습니다.