如果您希望付款的用户与有活动的用户的比例,只需单独汇总每个表格:
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.这将使可能使查询变得昂贵的数据成倍增加.