Hirdetés

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

  • kojakhu

    újonc

    válasz bambano #5009 üzenetére

    Közben meg is írta h mi a pontos elvárás, de a kódolástól nem láttam :)

    Itt van, ami szerintem már helyes, csak azért h hátha meg lehet mégis csinálni.

    Viszont performancia miatt nem lesz használható.
    Max akkor, ha valahogy a sorok számát a rekurzív részben lehet limitálni. Pl ha lehet tudni, hogy max mekkora gapek vannak a logok között (ezt is ki lehet számolni akár), vagy esetleg az előző munkámmal lehet összeszerelni úgy h az ott előálló csoportokban kell csak részcsoportokat képezni.

    Szóval brahiból itt az újabb SQLFiddle link
    Pls valaki mindenképpen válaszoljon (ha jó a megoldás, ha nem), mert a blogon "újoncként" nem írhatok csak 1-et amíg nincs rám válasz...

    Setup:
    create table t (dt timestamp);
    -- group 1
    insert into t values (current_timestamp);
    insert into t values (current_timestamp + interval '10' second);
    insert into t values (current_timestamp + interval '59' second);
    -- group 2
    insert into t values (current_timestamp + interval '70' second);
    insert into t values (current_timestamp + interval '71' second);
    insert into t values (current_timestamp + interval '129' second);
    -- group 3
    insert into t values (current_timestamp + interval '200' second);
    insert into t values (current_timestamp + interval '210' second);
    insert into t values (current_timestamp + interval '220' second);
    insert into t values (current_timestamp + interval '259' second);
    -- group 4
    insert into t values (current_timestamp + interval '260' second);
    insert into t values (current_timestamp + interval '261' second);

    Lekérdezés:
    WITH RECURSIVE rd(grp, mindt) AS (
    SELECT 1 AS grp
    , MIN(dt)
    FROM t
    UNION
    SELECT rd.grp+1 AS grp
    , FIRST_VALUE(t.dt) OVER (ORDER BY t.dt)
    FROM t, rd
    WHERE t.dt >= rd.mindt + INTERVAL '1' MINUTE
    ) -- rd
    , grpd AS (
    SELECT grp
    , t.*
    , MIN(dt) OVER (PARTITION BY grp) mindt
    , MAX(dt) OVER (PARTITION BY grp) maxdt
    , COUNT(*) OVER (PARTITION BY grp) cnt
    FROM rd, t
    WHERE t.dt >= rd.mindt AND t.dt < rd.mindt + INTERVAL '1' MINUTE
    ) -- grpd
    SELECT v.*
    , maxdt-mindt AS grp_duration
    FROM grpd AS v
    ORDER BY dt

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