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

Hitung hasil Pendapatan Berulang Bulanan (MRR) menggunakan postgres

Ini agak sederhana generate_series dapat digunakan dengan INTERVAL s dan kita dapat menggunakan LATERAL JOIN untuk menghasilkan data untuk setiap baris json.

WITH j AS(
SELECT '{
  "id": "1",
  "amount": 3900,
  "interval": "1 WEEK",
  "created": 1424011935
}'::json AS data
UNION ALL
SELECT '{
  "id": "2",
  "amount": 100,
  "interval": "23.5 DAY",
  "created": 552614400
}'::json
),
dates AS(
SELECT
'2008-03-01 00:00'::timestamp AS start
,'2015-03-08 07:00'::timestamp AS stop
)
SELECT j.data->>'id'
    ,sum((j.data->>'amount')::int)
    ,count(*) as intervals
FROM j
CROSS JOIN dates
CROSS JOIN LATERAL
    (SELECT i
    FROM generate_series(to_timestamp((j.data->>'created')::int), dates.stop + (j.data->>'interval')::interval,(j.data->>'interval')::interval) as i
    WHERE i BETWEEN dates.start AND dates.stop
    ) AS q
GROUP BY j.data->>'id'

Di atas memberi kita hasil:

 id |  sum  | intervals
----+-------+-----------
 1  | 11700 |         3
 2  | 11000 |       110

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. Rencana Kueri postgres dengan indeks

  2. Bagaimana cara membulatkan nilai milidetik dari timestamp(0) di PostgreSQL?

  3. Postgresql:Ekspor CSV dengan jeda baris yang lolos

  4. sqlalchemy postgresql di mana int =string

  5. Bisakah saya menulis fungsi PostgreSQL di Ruby on Rails?