PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Изчислете резултата от месечните периодични приходи (MRR) с помощта на postgres

Това е доста просто generate_series може да се използва с INTERVAL s и можем да използваме LATERAL JOIN за генериране на данните за всеки 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'

Горното ни дава резултата:

 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. PGEast, хардуерен сравнителен анализ и PG Performance Farm

  2. JDBC драйверът не е наличен за „org.postgresql.Driver“ за Spring Roo

  3. Промяната на ORDER BY от id към друга индексирана колона (с нисък LIMIT) има огромна цена

  4. Инструмент за конвертиране на t-sql (SQL Server) съхранена процедура в pgsql (postgre sql)

  5. Актуализиране или вмъкване (множество редове и колони) от подзаявка в PostgreSQL