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

SQL का उपयोग करके महीने दर महीने अवधारण की गणना कैसे करें

निम्नलिखित परीक्षण तालिका को देखते हुए (जो आपको प्रदान करना चाहिए था):

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() . द्वारा नहीं की जाती है अगले चरण में।

-> SQLfiddle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. रेल 5.1 . में उचित नियंत्रक के लिए खोज प्रपत्र रूटिंग नहीं

  2. psycopg2 मैपिंग पायथन:पोस्टग्रेज के लिए डिक्ट्स की सूची:INSERT कथन के लिए समग्र प्रकार की सरणी

  3. जीरो डाउनटाइम के साथ PostgreSQL 11 को PostgreSQL 12 में अपग्रेड कैसे करें

  4. स्ट्रिंग कॉलम पर पोस्टग्रेस्क्ल इंडेक्स

  5. प्राथमिक के साथ कोई कनेक्शन पूल नहीं मिला