Ако искате съотношението на потребителите, които са направили плащания към тези с активност, просто обобщете всяка таблица поотделно:
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;
РЕДАКТИРАНЕ:
Нуждаете се от таблица с всички дати в диапазона. Това е най-големият проблем.
Тогава бих препоръчал:
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;
Бележки:
- Това връща
NULL
в дните, в които няма активност. Това за мен има повече смисъл от0
. - Това използва логика за датите, която работи както за дати, така и за стойности за дата/час.
- Логиката за дати може да използва индекс, който може да бъде важен за този тип заявка.
- Не препоръчвам да използвате
LEFT JOIN
с. Това ще умножи данните, което може да направи заявката скъпа.