sql >> データベース >  >> RDS >> PostgreSQL

ウィンドウ関数LAGは、値が計算されている列を参照できますか?

    素朴な再帰チェーン編み物:

            -- temp view to avoid nested CTE
    CREATE TEMP VIEW drag AS
            SELECT e.type,e.time_stamp
            , ROW_NUMBER() OVER www as rn                   -- number the records
            , FIRST_VALUE(e.time_stamp) OVER www as fst     -- the "group leader"
            , EXISTS (SELECT * FROM event x
                    WHERE x.type = e.type
                    AND x.time_stamp < e.time_stamp) AS is_dup
            FROM event e
            WINDOW www AS (PARTITION BY type ORDER BY time_stamp)
            ;
    
    WITH RECURSIVE ttt AS (
            SELECT d0.*
            FROM drag d0 WHERE d0.is_dup = False -- only the "group leaders"
        UNION ALL
            SELECT d1.type, d1.time_stamp, d1.rn
              , CASE WHEN d1.time_stamp - ttt.fst > 20 THEN d1.time_stamp
                     ELSE ttt.fst END AS fst   -- new "group leader"
              , CASE WHEN d1.time_stamp - ttt.fst > 20 THEN False
                     ELSE True END AS is_dup
            FROM drag d1
            JOIN ttt ON d1.type = ttt.type AND d1.rn = ttt.rn+1
            )
    SELECT * FROM ttt
    ORDER BY type, time_stamp
            ;
    

    結果:

    CREATE TABLE
    INSERT 0 10
    CREATE VIEW
     type | time_stamp | rn | fst | is_dup 
    ------+------------+----+-----+--------
        1 |          1 |  1 |   1 | f
        1 |          2 |  2 |   1 | t
        1 |          3 |  3 |   1 | t
        1 |         10 |  4 |   1 | t
        1 |         15 |  5 |   1 | t
        1 |         21 |  6 |   1 | t
        1 |         40 |  7 |  40 | f
        2 |          2 |  1 |   2 | f
        2 |         10 |  2 |   2 | t
        2 |         13 |  3 |   2 | t
    (10 rows)
    


    1. MySQLは、同じIDを持つ複数の行の値を新しい列にコピーしますか?

    2. MySQLパーティショニング:適切なパーティションを取得しない理由

    3. GROUPBYおよびHAVING句を使用したoraclesqlselect構文

    4. oraclesqlからpandasdfへのデータのロードを高速化する方法