निम्नलिखित परीक्षण तालिका को देखते हुए (जो आपको प्रदान करना चाहिए था):
CREATE TEMP TABLE transaction (buyer_id int, tstamp timestamp);
INSERT INTO transaction VALUES
(1,'2012-01-03 20:00')
,(1,'2012-01-05 20:00')
,(1,'2012-01-07 20:00') -- multiple transactions this month
,(1,'2012-02-03 20:00') -- next month
,(1,'2012-03-05 20:00') -- next month
,(2,'2012-01-07 20:00')
,(2,'2012-03-07 20:00') -- not next month
,(3,'2012-01-07 20:00') -- just once
,(4,'2012-02-07 20:00'); -- just once
तालिका auth_user
समस्या के लिए प्रासंगिक नहीं है।tstamp
का उपयोग करना कॉलम नाम के रूप में क्योंकि मैं पहचानकर्ताओं के रूप में आधार प्रकारों का उपयोग नहीं करता हूं।
मैं विंडो फ़ंक्शन का उपयोग करने जा रहा हूँ lag()
बार-बार खरीदारों की पहचान करने के लिए। इसे छोटा रखने के लिए मैं एक क्वेरी स्तर में कुल और विंडो फ़ंक्शंस को जोड़ता हूं। ध्यान रखें कि विंडो फ़ंक्शन बाद लागू होते हैं कुल कार्य।
WITH t AS (
SELECT buyer_id
,date_trunc('month', tstamp) AS month
,count(*) AS item_transactions
,lag(date_trunc('month', tstamp)) OVER (PARTITION BY buyer_id
ORDER BY date_trunc('month', tstamp))
= date_trunc('month', tstamp) - interval '1 month'
OR NULL AS repeat_transaction
FROM transaction
WHERE tstamp >= '2012-01-01'::date
AND tstamp < '2012-05-01'::date -- time range of interest.
GROUP BY 1, 2
)
SELECT month
,sum(item_transactions) AS num_trans
,count(*) AS num_buyers
,count(repeat_transaction) AS repeat_buyers
,round(
CASE WHEN sum(item_transactions) > 0
THEN count(repeat_transaction) / sum(item_transactions) * 100
ELSE 0
END, 2) AS buyer_retention
FROM t
GROUP BY 1
ORDER BY 1;
परिणाम:
month | num_trans | num_buyers | repeat_buyers | buyer_retention_pct
---------+-----------+------------+---------------+--------------------
2012-01 | 5 | 3 | 0 | 0.00
2012-02 | 2 | 2 | 1 | 50.00
2012-03 | 2 | 2 | 1 | 50.00
मैंने आपके प्रश्न को लेन-देन की संख्या और खरीदारों की संख्या के बीच अंतर प्रदान करने के लिए बढ़ाया है।
OR NULL
repeat_transaction
. के लिए FALSE
convert को कन्वर्ट करने का काम करता है करने के लिए NULL
, इसलिए उन मानों की गणना count()
. द्वारा नहीं की जाती है अगले चरण में।