festinko

Untitled

Dec 16th, 2022
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 1.89 KB | None | 0 0
  1. WITH
  2.     preparedData as (
  3.         SELECT
  4.             p.userID,
  5.       p.productID,
  6.       pr.productValue,
  7.             paymentAmount,
  8.             paymentPeriod,
  9.             paymentDateTime,
  10.             DATE_TRUNC(DATETIME(paymentDateTime), MONTH) as prepaidPeriodStart,
  11.       DATE_TRUNC(DATE_ADD(DATETIME(paymentDateTime), INTERVAL paymentPeriod MONTH), MONTH) as prepaidPeriodEnd,
  12.       DATE_TRUNC(DATE_ADD(DATETIME(paymentDateTime), INTERVAL paymentPeriod MONTH), DAY) as prepaidPeriodEndDay,
  13.             DATE_ADD(DATETIME(paymentDateTime), INTERVAL paymentPeriod MONTH) as prepaidPeriodEndDateTime
  14.         FROM
  15.             `uptimerobot-001.ur.payments` p
  16.  
  17.     LEFT JOIN
  18.     `uptimerobot-001.ur.products` pr
  19.      
  20.       ON p.productID = pr.productID
  21.  
  22.         LEFT JOIN   (
  23.             SELECT
  24.                 userID,
  25.                 MAX(paymentDateTime) lastPaymentDateTime
  26.             FROM
  27.                 `uptimerobot-001.ur.payments`
  28.            
  29.             WHERE
  30.                 paymentStatus = 1
  31.                 AND paymentPeriod IN (1,12)
  32.                 AND userID IS NOT NULL
  33.             GROUP BY
  34.                 userID
  35.             ) lp
  36.             ON p.userID =lp.userID AND p.paymentDateTime = lp.lastPaymentDateTime
  37.  
  38.         WHERE
  39.             paymentStatus = 1
  40.             AND paymentPeriod IN (1,12)
  41.             AND p.userID IS NOT NULL
  42.             AND lp.lastPaymentDateTime IS NOT NULL
  43.     ),
  44.     calendar as (
  45.         SELECT
  46.         DATE_TRUNC(DATETIME(paymentDateTime), DAY) as reportingYearMonthDay
  47.         FROM `uptimerobot-001.ur.payments`
  48.         GROUP BY
  49.             reportingYearMonthDay
  50.     )
  51.  
  52.   SELECT
  53.         reportingYearMonthDay,
  54.         COUNT(DISTINCT userID) churnedCustomers,
  55.         (CASE
  56.             WHEN DATE_ADD(reportingYearMonthDay, INTERVAL 17 DAY) >= CURRENT_DATE THEN 1
  57.             WHEN DATE_ADD(reportingYearMonthDay, INTERVAL 17 DAY) < CURRENT_DATE THEN 0
  58.         ELSE 99999999999999
  59.         END) isGracePeriod
  60.  
  61.   FROM
  62.     preparedData pd
  63.    
  64.     LEFT JOIN calendar cal
  65.         ON pd.prepaidPeriodEndDateTime > reportingYearMonthDay AND pd.prepaidPeriodEndDay < DATE_ADD(cal.reportingYearMonthDay, INTERVAL 1 DAY)
  66.    
  67.     GROUP BY
  68.         reportingYearMonthDay
  69.    
  70.     ORDER BY
  71.         reportingYearMonthDay DESC
  72.  
  73.    
Add Comment
Please, Sign In to add comment