Hvis du vil have forholdet mellem brugere, der har foretaget betalinger, og dem med aktivitet, skal du blot opsummere hver tabel individuelt:
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;
EDIT:
Du skal bruge en tabel med alle datoer i intervallet. Det er det største problem.
Så vil jeg anbefale:
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;
Bemærkninger:
- Dette returnerer
NULL
på dage, hvor der ikke er aktivitet. Det giver mere mening for mig end0
. - Dette bruger logik på datoerne, der fungerer for både datoer og dato/tidsværdier.
- Logikken for datoer kan gøre brug af et indeks, hvilket kan være vigtigt for denne type forespørgsel.
- Jeg anbefaler ikke at bruge
LEFT JOIN
s. Det vil mangedoble dataene, hvilket kan gøre forespørgslen dyr.