アクティビティのあるユーザーに対する支払いを行ったユーザーの比率が必要な場合は、各テーブルを個別に要約してください。
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
の使用はお勧めしません s。これによりデータが増加し、クエリのコストが高くなる可能性があります。