Würde etwas in dieser Art besser funktionieren (angepasst an das scorable query-Format – dies ist ein Test für den Data Explorer
):
-- [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
Wenn ein Benutzer gelöscht wird, wird er aus der Tabelle invited_users entfernt und wäre somit nicht mehr in der Zählung enthalten. Wenn die Löschung innerhalb von 10 Tagen erfolgte, würde sie automatisch korrigiert werden, wenn sie länger dauert, müsste eine manuelle Score-Aktualisierung erfolgen.
Die Verwendung des redeemed_at-Datums würde diejenigen Einladungen berücksichtigen, die vor mehr als 10 Tagen erstellt wurden.
AND iu.user_id <> i.invited_by_id würde auch Selbst-Einladungen ausschließen.
Das Hinzufügen der users-Tabelle und die Bedingung AND u.created_at > iu.redeemed_at würden auch das Einladen bestehender Benutzer ausschließen.