Total de visualizações em vários tópicos

E aí, pessoal!

Estou testando algumas consultas de distintivos aqui :slight_smile: Algumas estão funcionando bem e outras ainda estou tentando.

Alguém sabe como criar uma consulta que conceda um distintivo a um usuário que tenha X visualizações em tópicos criados em uma categoria específica? Consegui montar essa consulta, mas apenas para um tópico (usuário teve pelo menos X visualizações em um tópico de uma categoria específica). O código é:

SELECT p.user_id, min(p.created_at) granted_at, MIN(p.id) post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE category_id = (
  SELECT id FROM categories WHERE name ilike 'Technology'
) AND p.post_number = 1
AND views >= 10
and (:backfill OR ( p.id IN (:post_ids) ))
GROUP BY p.user_id

Mas, em vez de considerar apenas um tópico, gostaria de conceder o distintivo para aqueles que alcançarem, por exemplo, 500 visualizações na soma das visualizações de todos os tópicos que essa pessoa criou na categoria Y. Alguém sabe como conseguir isso? :smiley:

Talvez esta seja uma solução (mais testes em breve :D)

    SELECT p.user_id, min(p.created_at) granted_at, MIN(p.id) post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE category_id = (
  SELECT id FROM categories WHERE name ilike 'Technology'
) AND p.post_number = 1
and (:backfill OR ( p.id IN (:post_ids) ))
GROUP BY p.user_id
HAVING SUM (views) > XXXXXXXXXXX

Oi pessoal, consegui testar essa consulta lá em cima e funcionou! Agora, estou me perguntando se alguém pode me ajudar com outro desafio. Esta é a consulta:

SELECT p.user_id, min(p.created_at) granted_at, MIN(p.id) post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE category_id = (
  SELECT id FROM categories WHERE name ilike 'Arts'
) AND p.post_number = 1
and (:backfill OR ( p.id IN (:post_ids) ))
GROUP BY p.user_id
HAVING SUM (views) >= 100

Neste exemplo: o usuário que cria histórias na categoria Arts e essas histórias atingem 100 visualizações receberá a medalha. O problema é que:
Precisarei alterar essa lógica ao longo do tempo, porque o número de visualizações aumentará.
Essa medalha exige 100 visualizações hoje, mas pode exigir 1000 visualizações daqui a 6 meses.

O problema é que, quando altero a consulta, ela é executada novamente todos os dias e os usuários que já a receberam a perderiam.

E isso seria um desastre. Imaginem que vocês alcançaram (agora, no início da plataforma) 10 visualizações e ganharam uma Medalha de Nível 2 em Tecnologia. Mas alguns meses depois a plataforma cresce e agora o Nível 2 exige não mais 10 visualizações, mas 100. Vocês perderiam a medalha.

Existe alguma maneira de evitar que isso aconteça?