Jeśli chcesz, aby stosunek użytkowników, którzy dokonali płatności, do tych wykazujących aktywność, po prostu podsumuj każdą tabelę indywidualnie:
select p.cnt / a.cnt
from (select count(distinct user_id) as cnt from activity a) a cross join
(select count(distinct user_id) as cnt from payment) p;
EDYCJA:
Potrzebujesz tabeli ze wszystkimi datami z zakresu. To jest największy problem.
W takim razie polecam:
SELECT d.dte,
( ( SELECT COUNT(DISTINCT p.user_id)
FROM payments p
WHERE p.payment_date >= d.dte and p.payment_date < d.dte + INTERVAL 1 DAY
) /
NULLIF( (SELECT COUNT(DISTINCT a.user_id)
FROM activity a
WHERE a.login_time >= d.dte and p.login_time < d.dte + INTERVAL 1 DAY
), 0
) as ratio
FROM (SELECT date('2017-01-01') dte UNION ALL
SELECT date('2017-01-02') dte UNION ALL
SELECT date('2017-01-03') dte UNION ALL
SELECT date('2017-01-04') dte UNION ALL
SELECT date('2017-01-05') dte
) d;
Uwagi:
- To zwraca
NULL
w dni, w których nie ma aktywności. To ma dla mnie więcej sensu niż0
. - To wykorzystuje logikę w datach, która działa zarówno dla dat, jak i wartości daty/czasu.
- Logika dat może wykorzystywać indeks, co może być ważne w przypadku tego typu zapytań.
- Nie polecam używania
LEFT JOIN
s. To pomnoży dane, które mogą sprawić, że zapytanie będzie drogie.