PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara menghitung retensi bulan ke bulan menggunakan SQL

Diberikan tabel pengujian berikut (yang seharusnya Anda berikan):

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

Tabel auth_user tidak relevan dengan masalah.
Menggunakan tstamp sebagai nama kolom karena saya tidak menggunakan tipe dasar sebagai pengenal.

Saya akan menggunakan fungsi jendela lag() untuk mengidentifikasi pembeli berulang. Singkatnya, saya menggabungkan fungsi agregat dan jendela dalam satu tingkat kueri. Ingatlah bahwa fungsi jendela diterapkan setelah fungsi agregat.

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;

Hasil:

  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

Saya memperluas pertanyaan Anda untuk memberikan perbedaan antara jumlah transaksi dan jumlah pembeli.

OR NULL untuk repeat_transaction berfungsi untuk mengonversi FALSE ke NULL , jadi nilai-nilai itu tidak dihitung oleh count() di langkah berikutnya.

-> 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. Pilih baris acak dari tabel PostgreSQL dengan probabilitas baris tertimbang

  2. Pemetaan JPA Multi-Baris dengan ElementCollection

  3. Bagaimana cara mengubah string menjadi stempel waktu tanpa zona waktu

  4. PostgreSQL 10 di Linux - LC_COLLATE lokal en_US.utf-8 tidak valid

  5. tujuan menyusun di Postgres