Can window function LAG reference the column which value is being calculated?

前端 未结 3 766
北海茫月
北海茫月 2021-01-18 01:30

I need to calculate value of some column X based on some other columns of the current record and the value of X for the previous record (using some partition and order). Bas

3条回答
  •  误落风尘
    2021-01-18 02:15

    Naive recursive chain knitter:


            -- 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
            ;
    

    Results:


    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)
    

提交回复
热议问题