Я думаю, что вы можете просто подсчитать количество пользователей в тесте и подписке и взять соотношение для каждой группы:
SELECT e.experiment_id,
SUM( e.experiment_assignment = 'test' AND s.user_id IS NOT NULL AND s.subscription_event = 'subscription_start') / SUM(e.experiment_assignment = 'test') as test_ratio,
SUM( e.experiment_assignment = 'control' AND s.user_id IS NOT NULL AND s.subscription_event = 'subscription_start') / SUM(e.experiment_assignment = 'test') as control_ratio
FROM experiments e LEFT JOIN
subscriptions s
ON e.user_id = s.user_id
GROUP BY e.experiment_id;
Это предполагает, что пользователи не дублируются ни в одной из таблиц для конкретного эксперимента..
РЕДАКТИРОВАТЬ:
Если есть дубликаты, используйте COUNT(DISTINCT)
:
SELECT e.experiment_id,
(COUNT(DISTINCT CASE WHEN e.experiment_assignment = 'test' AND s.subscription_event = 'subscription_start' THEN s.user_id END) /
COUNT(DISTINCT CASE WHEN e.experiment_assignment = 'test' THEN e.user_id END)
) as test_ratio,
(COUNT(DISTINCT CASE WHEN e.experiment_assignment = 'control' AND s.subscription_event = 'subscription_start' THEN s.user_id END) /
COUNT(DISTINCT CASE WHEN e.experiment_assignment = 'control' THEN e.user_id END)
) as control_ratio
FROM experiments e LEFT JOIN
subscriptions s
ON e.user_id = s.user_id
GROUP BY e.experiment_id;