यह क्वेरी मेरे द्वारा यहां लिखी गई क्वेरी से संशोधित की गई है:SQL में कोहोर्ट विश्लेषण ए>
यहाँ अंतिम प्रश्न है:
SELECT
STR_TO_DATE(CONCAT(tb.cohort, ' Monday'), '%X-%V %W') as date,
size,
w1,
w2,
w3,
w4,
w5,
w6,
w7
FROM (
SELECT u.cohort,
IFNULL(SUM(s.Offset = 0), 0) w1,
IFNULL(SUM(s.Offset = 1), 0) w2,
IFNULL(SUM(s.Offset = 2), 0) w3,
IFNULL(SUM(s.Offset = 3), 0) w4,
IFNULL(SUM(s.Offset = 4), 0) w5,
IFNULL(SUM(s.Offset = 5), 0) w6,
IFNULL(SUM(s.Offset = 6), 0) w7
FROM (
SELECT
UserId,
DATE_FORMAT(AddedDate, "%Y-%u") AS cohort
FROM users
) as u
LEFT JOIN (
SELECT DISTINCT
payments.UserId,
FLOOR(DATEDIFF(payments.PaymentDate, users.AddedDate)/7) AS Offset
FROM payments
LEFT JOIN users ON (users.UserId = payments.UserId)
) as s ON s.UserId = u.UserId
GROUP BY u.cohort
) as tb
LEFT JOIN (
SELECT DATE_FORMAT(AddedDate, "%Y-%u") dt, COUNT(*) size FROM users GROUP BY dt
) size ON tb.cohort = size.dt
तो इसका मूल यह है कि हम उपयोगकर्ताओं और उनके द्वारा साइन अप करने की तारीख को पकड़ लेते हैं और तारीख को साल-सप्ताह की संख्या के अनुसार प्रारूपित करते हैं, क्योंकि हम एक साप्ताहिक समूह कर रहे हैं।
SELECT
UserId,
DATE_FORMAT(AddedDate, "%Y-%u") AS cohort
FROM users
चूंकि हम समूह द्वारा समूह बनाना चाहते हैं, इसलिए हमें इसे क्वेरी के FROM भाग में एक सबक्वेरी में रखना होगा।
फिर हम उपयोगकर्ताओं की भुगतान जानकारी में शामिल होना चाहते हैं।
SELECT DISTINCT
payments.UserId,
FLOOR(DATEDIFF(payments.PaymentDate, users.AddedDate)/7) AS Offset
FROM payments
LEFT JOIN users ON (users.UserId = payments.UserId)
यह प्रति उपयोगकर्ता अद्वितीय साप्ताहिक भुगतान ईवेंट प्राप्त करेगा, जितने सप्ताह वे उपयोगकर्ता रहे हैं। हम अलग का उपयोग करते हैं क्योंकि यदि किसी उपयोगकर्ता ने एक सप्ताह में 2 खरीदारी की है, तो हम उसे दो उपयोगकर्ताओं के रूप में नहीं गिनना चाहते हैं।
हम केवल भुगतान तालिका का उपयोग नहीं करते हैं, क्योंकि कुछ उपयोगकर्ता साइन अप कर सकते हैं और भुगतान नहीं कर सकते हैं। इसलिए हम उपयोगकर्ता तालिका से चयन करते हैं और भुगतान तालिका में शामिल होते हैं।
फिर आप सप्ताह के अनुसार समूह बनाते हैं - u.cohort। फिर आप यह पता लगाने के लिए कि कितने लोगों ने साइन अप करने के बाद के हफ्तों में भुगतान किया है, सप्ताह की संख्याओं को एकत्रित करते हैं।
मेरे द्वारा उपयोग किए जाने वाले MySQL के संस्करण में sql_mode केवल_full_group_by पर सेट था। इसलिए कोहोर्ट का आकार प्राप्त करने के लिए मैंने अधिकांश क्वेरी को सबक्वेरी में रखा ताकि मैं कोहॉर्ट का आकार प्राप्त करने के लिए उपयोगकर्ताओं से जुड़ सकूं।
आगे के विचार:
सप्ताह के अनुसार फ़िल्टर करना सरल है। tb.cohort> प्रारंभ तिथि और tb.cohort <समाप्ति तिथि जहां प्रारंभ और समाप्ति तिथि "%Y-%u" के साथ स्वरूपित है। क्वेरी को और अधिक कुशल बनाने के लिए आप संभवतः उन भुगतान ईवेंट को फ़िल्टर करना चाहेंगे जो दिनांक सीमा के अंतर्गत नहीं आते हैं, इसलिए आप उस डेटा पर शामिल नहीं हो रहे हैं जिसकी आपको आवश्यकता नहीं है।
आप उन मामलों को कवर करने के लिए कैलेंडर तालिका का उपयोग करने पर विचार कर सकते हैं जहां सप्ताह के दौरान कोई उपयोगकर्ता साइन अप नहीं होता है।
यहां काम करने वाली हर चीज के साथ एक पहेली है:http://sqlfiddle.com/#!9/172dbe/ 1