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

Получете различни последователни периоди от време от припокриващи се интервали от време

Логиката е:

  • в началото на интервал добавя стойността му към кумулативна сума
  • в края на интервал извадете стойността му от тази сума
  • но за да метете линията за дата, ще трябва да съберем всички (уникални) печати за дата/час, или начало, или спиране.

Така че въпросът е:конвертирайте данните от поредица от интервали към поредица от (начало/стоп) събития и ги обобщете.

-- \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. ГРЕШКА:колона за релация не съществува PostgreSQL, Не може да се изпълни заявка за вмъкване

  2. Проблем с npgsql в приложението c# - съществуваща връзка беше принудително затворена от отдалечения хост

  3. Почасово групиране на редове с помощта на Django

  4. Преобразуване на колони на pandas в списък на PostgreSQL?

  5. Knex.js принуждава повторно използване на сесията за 4 следващи заявки