Om du vill ha förhållandet mellan användare som har gjort betalningar och de med aktivitet, sammanfatta bara varje tabell individuellt:
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 behöver en tabell med alla datum i intervallet. Det är det största problemet.
Då skulle jag rekommendera:
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;
Anmärkningar:
- Detta returnerar
NULL
på dagar då det inte är någon aktivitet. Det är mer vettigt för mig än0
. - Detta använder logik för datumen som fungerar för både datum och datum/tidsvärden.
- Logiken för datum kan använda ett index, vilket kan vara viktigt för den här typen av fråga.
- Jag rekommenderar inte att du använder
LEFT JOIN
s. Det kommer att multiplicera data vilket kan göra frågan dyr.