यदि आप उन उपयोगकर्ताओं का अनुपात चाहते हैं जिन्होंने गतिविधि वाले लोगों से भुगतान किया है, तो बस प्रत्येक तालिका को अलग-अलग सारांशित करें:
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
का उपयोग करने की अनुशंसा नहीं करता हूं एस। यह उस डेटा को गुणा करेगा जो क्वेरी को महंगा बना सकता है।