sql >> Databáze >  >> RDS >> PostgreSQL

Součet časového rozdílu mezi řádky

Zvláštním problémem je nepromeškat časové úseky do vnějšího časového rámce.
Za předpokladu, že další řádek pro jakékoli dané id má vždy opačný stav.
Použití názvu sloupce ts místo recordTime :

WITH span AS (
   SELECT '2014-03-01 13:00'::timestamp AS s_from  -- start of time range
        , '2014-03-01 14:00'::timestamp AS s_to    -- end of time range
   )
, cte AS (
   SELECT id, ts, status, s_to
        , lead(ts, 1, s_from) OVER w AS span_start
        , first_value(ts)     OVER w AS last_ts
   FROM   span s
   JOIN   tbl  t ON t.ts BETWEEN s.s_from AND s.s_to
   WINDOW w AS (PARTITION BY id ORDER BY ts DESC)
   )
SELECT id, sum(time_disconnected)::text AS total_disconnected
FROM  (
   SELECT id, ts - span_start AS time_disconnected
   FROM   cte
   WHERE  status = 'Connected'

   UNION  ALL  
   SELECT id, s_to - ts
   FROM   cte
   WHERE  status = 'Disconnected'
   AND    ts = last_ts
   ) sub
GROUP  BY 1
ORDER  BY 1;

Vrátí požadované intervaly.
ID bez položek ve vybraném časovém rozsahu se nezobrazují. Budete je muset dodatečně dotazovat.

SQL Fiddle.
Poznámka:Přetypuji výsledný total_disconnected na text v houslích, protože typ interval se zobrazuje v hrozném formátu.

Přidat ID bez zadání ve vybraném časovém rámci


Přidat k dotazu výše (před konečným ORDER BY 1 ):

...
UNION  ALL
SELECT id, total_disconnected
   FROM  (
   SELECT DISTINCT ON (id)
          t.id, t.status, (s.s_to - s.s_from)::text AS total_disconnected
   FROM   span     s
   JOIN   tbl      t ON t.ts < s.s_from  -- only from before time range
   LEFT   JOIN cte c USING (id)
   WHERE  c.id IS NULL         -- not represented in selected time frame
   ORDER  BY t.id, t.ts DESC   -- only the latest entry
   ) sub
WHERE  status = 'Disconnected' -- only if disconnected
ORDER  BY 1;

SQL Fiddle.

Nyní pouze ID bez položek nebo dříve vybrané časové období se nezobrazí.



  1. ORDER BY s vnitřním dotazem, přičemž u ORA-00907 chybí pravá závorka

  2. sloučit všechny řádky sloupce do jednoho sloupce ze spojené tabulky

  3. C#:Objekt nelze přetypovat z DbNull na jiné typy

  4. Django -- Modely neexistují, ale Django je stále načítá