Als u de verhouding wilt tussen gebruikers die betalingen hebben gedaan en gebruikers met activiteit, vat u elke tabel afzonderlijk samen:
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;
BEWERKEN:
Je hebt een tabel nodig met alle datums in het bereik. Dat is het grootste probleem.
Dan zou ik aanraden:
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;
Opmerkingen:
- Dit retourneert
NULL
op dagen dat er geen activiteit is. Dat lijkt me logischer dan0
. - Dit gebruikt logica voor de datums die werkt voor zowel datums als datum/tijd-waarden.
- De logica voor datums kan gebruik maken van een index, wat belangrijk kan zijn voor dit type zoekopdracht.
- Ik raad het gebruik van
LEFT JOIN
af s. Dat zal de gegevens vermenigvuldigen die de zoekopdracht duur kunnen maken.