Gamificação e convites

Algo assim funcionaria melhor (ajustado para o formato de consulta pontuável - este é um teste para o explorador de dados :slight_smile:):

-- [params]
-- date :start_date
-- date :end_date

SELECT 
    invited_by_id AS user_id,
    COUNT(*) AS user_invites,
    COUNT(*) * 10 AS invite_score
FROM invited_users iu
  JOIN invites i ON i.id = iu.invite_id
  JOIN users u ON u.id = iu.user_id
WHERE iu.redeemed_at::date BETWEEN :start_date AND :end_date
  AND iu.user_id <> i.invited_by_id 
  AND u.created_at > iu.redeemed_at
GROUP BY invited_by_id
ORDER BY user_invites DESC

Quando um usuário é excluído, ele é removido da tabela invited_users, portanto, não estaria mais na contagem. Se a exclusão ocorresse em até 10 dias, seria auto-corrigida; se demorasse mais, seria necessária uma atualização manual da pontuação.

Usar a data redeemed_at contabilizaria os convites criados há mais de 10 dias.

AND iu.user_id <> i.invited_by_id também excluiria convites próprios.

A junção da tabela users e a adição de AND u.created_at > iu.redeemed_at também excluiriam o convite de usuários existentes.

3 curtidas