Hirdetés

Új hozzászólás Aktív témák

  • kojakhu

    újonc

    válasz kw3v865 #4995 üzenetére

    Hali, Lehet erre gondolsz. Addig egy entry egy csoport, amíg a timestamp gap nagyobb nem lesz mint 1 perc. Csoportokban meg lehet N db entry is amíg a gap nem túl nagy.

    Ezt így lehet, pl.
    Itt az SQLFiddle : [link]

    Kód:

    Setup:

    create table t (dt timestamp);
    -- group 1
    insert into t values (current_timestamp - interval '10' second);
    insert into t values (current_timestamp);
    insert into t values (current_timestamp + interval '10' second);
    -- group 2
    insert into t values (current_timestamp + interval '120' second);
    insert into t values (current_timestamp + interval '130' second);
    -- group 3
    insert into t values (current_timestamp + interval '220' second);
    insert into t values (current_timestamp + interval '230' second);
    Lekérdezés:

    WITH
    diffs AS (
    SELECT dt
    , LAG(dt) OVER (ORDER BY dt) AS prevdt
    , LEAD(dt) OVER (ORDER BY dt) AS nextdt
    , ROW_NUMBER() OVER (ORDER BY dt) AS rn
    FROM t
    ) -- diffs
    , group_gaps_and_flags AS (
    SELECT v.*
    , dt-prevdt AS prev_gap
    , CASE WHEN prevdt IS NULL OR dt-prevdt > interval '1' minute
    THEN 'Y'
    END AS group_start_flag
    , nextdt - dt AS next_gap
    , CASE WHEN nextdt IS NULL OR nextdt-dt > interval '1' minute
    THEN 'Y'
    END AS group_end_flag
    , CASE WHEN prevdt IS NULL OR dt-prevdt > interval '1' minute
    THEN rn
    END AS rn_if_start
    FROM diffs AS v
    ) -- gaps_and_groups
    , groups AS (
    SELECT v.*
    , MAX(rn_if_start) OVER (ORDER BY dt) -- ROWS BETWEEN UNBOUNDED_PRECEEDING AND CURRENT_ROW
    AS my_group
    FROM group_gaps_and_flags AS v
    ) -- groups
    -- .
    -- SELECT * FROM groups; -- separator for testing
    -- .
    SELECT my_group, MIN(dt), MAX(dt), COUNT(dt)
    FROM groups
    GROUP BY my_group
    ORDER BY my_group


    sorry, nem tudom még ezen a fórumon hogy kell kódot beszúrni jól...

Új hozzászólás Aktív témák