Геймификация и приглашения

Не подойдет ли что-то вроде этого (адаптированное под формат оцениваемых запросов — это тестовый запрос для Data Explorer :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

При удалении пользователя он удаляется из таблицы invited_users, поэтому больше не будет учитываться в подсчёте. Если удаление произошло в течение 10 дней, счётчик автоматически скорректируется; если прошло больше времени, потребуется ручное обновление очков.

Использование даты redeemed_at учтёт те приглашения, которые были созданы более 10 дней назад.

Условие AND iu.user_id <> i.invited_by_id также исключит самовызовы.

Присоединение таблицы users и добавление условия AND u.created_at > iu.redeemed_at позволит исключить приглашение уже существующих пользователей.

3 лайка