30 dias de selo de visitante

Vi que esta medalha existe para usuários que visitam o fórum consecutivamente por 10 ou 365 dias, mas quero criar uma medalha automática no meu fórum que seja concedida a quem visitar o fórum por 30 dias consecutivos.

Acima de tudo, o que me interessa é obter o SQL.

Só para constar, você pode encontrar as consultas existentes usando o Data Explorer.

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

Aqui está a de 365 dias:

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

e a de 10 dias:

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

Então, estou achando que isso pode funcionar para 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

… o que eu verifiquei que executa e parece retornar resultados aparentemente sensatos, mas ainda não conferi os resultados detalhadamente :sweat_smile:

Muito obrigado, eu aprecio isso.

@merefield

Tenho tentado copiar o código, mas parece que está bloqueado. Obrigado novamente. :heart:

Sem saída? O que quer dizer? (Peço desculpas pelo meu espanhol ruim) Acabei de verificar e está funcionando bem. Verifique se você preencheu todos os campos obrigatórios e se não há erros de validação acima. Se for salvo, você verá o novo distintivo na parte inferior da lista à esquerda. Você também pode visualizar os resultados usando o link abaixo do SQL.

Eu estava tentando copiar o SQL do emblema que referia-se aos 10 dias no meu fórum e depois alterar para 30, mas não consegui copiá-lo. Mas, graças à sua ajuda, consegui criar o emblema que eu queria.