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

Nhận các phạm vi ngày liên tiếp khác nhau từ các phạm vi ngày trùng lặp

Logic là:

  • đầu của một khoảng cộng giá trị của nó thành tổng tích lũy
  • cuối của một khoảng trừ giá trị của nó từ tổng này
  • nhưng để quét sạch đường dữ liệu, chúng tôi sẽ phải thu thập các tem ngày / giờ (duy nhất), bắt đầu hoặc dừng.

Vì vậy, vấn đề là:chuyển đổi dữ liệu từ một chuỗi khoảng thời gian đến một loạt (bắt đầu / dừng) sự kiện và tổng hợp lại những điều này.

-- \i tmp.sql

create table coinsonperiod(
  id serial,
  startdate date,
  enddate date,
  coins integer
);
insert into coinsonperiod (startdate, enddate, coins) values
  ('2018-01-01','2018-01-31', 80)
, ('2018-01-07','2018-01-10', 10)
, ('2018-01-07','2018-01-31', 10)
, ('2018-01-11','2018-01-31', 5)
, ('2018-01-25','2018-01-27', 5)
, ('2018-02-02','2018-02-23', 100)
        ;

WITH changes AS (
    SELECT startdate AS tickdate , coins
            , 1 AS cover
    FROM coinsonperiod
    UNION ALL
    -- add 1 day to convert to half-open intervals
    SELECT 1+enddate AS tickdate, -1* coins
            , -1 AS cover
    FROM coinsonperiod
    )
, sumchanges  AS (
        SELECT tickdate, SUM(coins) AS change, SUM(cover) AS cover
        FROM changes
        GROUP BY tickdate
        )
, aggregated AS (
        SELECT
        tickdate AS startdate
        , lead(tickdate) over www AS enddate
        , sum(change) OVER www AS cash
          -- number of covered intervals
        , sum(cover) OVER www AS cover
        FROM sumchanges
        WINDOW www AS (ORDER BY tickdate)
        )
             -- substract one day from enddate to correct back to closed intervals
SELECT startdate, enddate-1 AS enddate, cash, cover
FROM aggregated
WHERE cover > 0
ORDER BY startdate
        ;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Luồng được tìm nạp từ Postgres với jOOQ không trả về kết quả từ lớp học

  2. kích hoạt postgresql trên cột tsvector nhận được LỖI:cột không tồn tại

  3. Biểu diễn bytea PostgreSQL 9.X trong 'hex' hoặc 'Escape' cho hình ảnh thu nhỏ

  4. local postgres db tiếp tục đưa ra lỗi giá trị khóa trùng lặp vi phạm ràng buộc duy nhất

  5. Lumen - Tạo kết nối cơ sở dữ liệu trong thời gian chạy