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. Django DatabaseError後に再接続する方法:クエリタイムアウト

    2. VBAを使用してテキストボックスに記述されたSQLを実行する

    3. IRI WorkbenchでのInformix(IDS12 DB)への接続

    4. mysqlwhere句のjsonフィールド