¿Funcionaría algo como esto mejor (ajustado para adaptarse al formato de consulta puntuable - esta es una prueba para el explorador de datos
):
-- [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
Cuando se elimina un usuario, se borra de la tabla invited_users, por lo que ya no estaría en el recuento. Si la eliminación ocurriera dentro de los 10 días, se corregiría automáticamente, si fuera más tiempo, necesitaría una actualización manual de la puntuación.
Usar la fecha redeemed_at tendría en cuenta aquellas invitaciones que se crearon hace más de 10 días.
AND iu.user_id <> i.invited_by_id también excluiría las autoinvitaciones.
Unir la tabla users y añadir AND u.created_at > iu.redeemed_at también excluiría la invitación a usuarios existentes.