Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

मैं mysql का उपयोग करके साप्ताहिक कोहोर्ट विश्लेषण तालिका कैसे बना सकता हूं?

यह क्वेरी मेरे द्वारा यहां लिखी गई क्वेरी से संशोधित की गई है: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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. शर्त के आधार पर किसी अन्य तालिका के कॉलम के साथ कॉलम मान अपडेट करें

  2. MyISAM से InnoDb में टेबल बदलने का समय कब है?

  3. लगातार दो पंक्तियों में तिथियों के बीच अंतर

  4. लैटिन1 एन्कोडेड कॉलम में UTF-8 वर्णों का पता कैसे लगाएं - MySQL

  5. एक चयन के भीतर MySQL प्रक्रिया?