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

Dapatkan rentang tanggal berurutan yang berbeda dari rentang tanggal yang tumpang tindih

Logikanya adalah:

  • di awal dari suatu interval tambahkan nilainya ke jumlah kumulatif
  • di akhir dari suatu interval kurangi nilainya dari jumlah ini
  • tetapi untuk menyapu garis tanggal, kita harus mengumpulkan semua cap tanggal/waktu (unik), mulai atau berhenti.

Jadi intinya adalah:konversikan data dari serangkaian interval ke serangkaian (mulai/hentikan) acara , dan agregat di atasnya.

-- \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. Diindeks ORDER BY dengan LIMIT 1

  2. Bagaimana saya bisa memasukkan stempel waktu dengan zona waktu di postgresql dengan pernyataan yang disiapkan?

  3. Kesalahan batas waktu H12 yang persisten untuk semua permintaan yang menjalankan kueri basis data

  4. Tidak ada pengemudi yang cocok. Mencoba terhubung ke database postgresql di Heroku menggunakan Hibernate

  5. Bagaimana cara menggabungkan kolom dalam SELECT Postgres?