add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
-- test data table
CREATE TABLE test (userid INT, pdate DATE, type VARCHAR(8));
-- test data
INSERT INTO test VALUES
(1,'2020-01-01','PURCHASE'),
(1,'2020-01-02','RENEW'),
(1,'2020-01-03','RENEW'),
(1,'2020-01-04','PURCHASE'),
(1,'2020-01-05','PURCHASE'),
(1,'2020-01-06','RENEW'),
(1,'2020-01-07','RENEW'),
(1,'2020-01-08','RENEW'),
(1,'2020-01-09','RENEW'),
(1,'2020-01-10','PURCHASE'),
(2,'2020-01-01','PURCHASE'),
(2,'2020-01-02','RENEW'),
(2,'2020-01-03','PURCHASE'),
(2,'2020-01-04','RENEW'),
(2,'2020-01-05','PURCHASE'),
(2,'2020-01-06','PURCHASE'),
(2,'2020-01-07','RENEW'),
(2,'2020-01-08','RENEW'),
(2,'2020-01-09','RENEW'),
(2,'2020-01-10','RENEW');
-- step 1 - get previous and next purchases dates pairs
SELECT t1.userid, t1.pdate prevdate, COALESCE(MIN(t2.pdate), '2099-01-01') nextdate
FROM test t1
LEFT JOIN test t2 ON t1.userid = t2.userid
AND t1.pdate < t2.pdate
AND t2.type = 'PURCHASE'
WHERE t1.type = 'PURCHASE'
GROUP BY t1.userid, t1.pdate;
userid prevdate nextdate
1 2020-01-01 2020-01-04
1 2020-01-04 2020-01-05
1 2020-01-05 2020-01-10
2 2020-01-01 2020-01-03
2 2020-01-03 2020-01-05
2 2020-01-05 2020-01-06
1 2020-01-10 2099-01-01
2 2020-01-06 2099-01-01
-- step 2 calculate renewals count for each dates pair
SELECT sq1.userid, sq1.prevdate, COUNT(CASE WHEN t3.type = 'RENEW' THEN 1 END) renewals
FROM test t3
LEFT JOIN ( SELECT t1.userid, t1.pdate prevdate, COALESCE(MIN(t2.pdate), '2099-01-01') nextdate
FROM test t1
LEFT JOIN test t2 ON t1.userid = t2.userid
AND t1.pdate < t2.pdate
AND t2.type = 'PURCHASE'
WHERE t1.type = 'PURCHASE'
GROUP BY t1.userid, t1.pdate ) sq1 ON t3.userid = sq1.userid
AND t3.pdate BETWEEN sq1.prevdate AND sq1.nextdate
GROUP BY sq1.userid, sq1.prevdate;
userid prevdate renewals
1 2020-01-01 2
1 2020-01-04 0
1 2020-01-05 4
1 2020-01-10 0
2 2020-01-01 1
2 2020-01-03 1
2 2020-01-05 0
2 2020-01-06 4
-- get statistic
SELECT sq2.renewals,
COUNT(sq2.renewals) renewalscount
FROM ( SELECT sq1.userid,
sq1.prevdate,
COUNT(CASE WHEN t3.type = 'RENEW'
THEN 1 END) renewals
FROM test t3
LEFT JOIN ( SELECT t1.userid,
t1.pdate prevdate,
COALESCE(MIN(t2.pdate), '2099-01-01') nextdate
FROM test t1
LEFT JOIN test t2 ON t1.userid = t2.userid
AND t1.pdate < t2.pdate
AND t2.type = 'PURCHASE'
WHERE t1.type = 'PURCHASE'
GROUP BY t1.userid, t1.pdate ) sq1 ON t3.userid = sq1.userid
AND t3.pdate BETWEEN sq1.prevdate
AND sq1.nextdate
GROUP BY sq1.userid,
sq1.prevdate ) sq2
GROUP BY sq2.renewals
ORDER BY sq2.renewals;
renewals renewalscount
0 3
1 2
2 1
4 2