PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tính toán kết quả Doanh thu Định kỳ Hàng tháng (MRR) bằng cách sử dụng bưu điện

Nó khá đơn giản generate_series có thể được sử dụng với INTERVAL s và chúng ta có thể sử dụng LATERAL JOIN để tạo dữ liệu cho mỗi hàng 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'

Ở trên cho chúng ta kết quả:

 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. Giới hạn kích thước của kiểu dữ liệu JSON trong PostgreSQL

  2. Làm cách nào để kết nối ứng dụng C # Windows mobile 6.5 với cơ sở dữ liệu Postgres?

  3. Sequelize:Truy vấn nếu ARRAY chứa một giá trị

  4. Quá trình xóa PostgresSql 9.6 đột nhiên trở nên chậm chạp

  5. Điều gì đã xảy ra với NpgsqlCopySerialize và NpgsqlCopyIn