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

Najděte řádky s odloženými obdobími a shromážděte jejich trvání

Toto je problém mezer a ostrovů. V tomto případě můžete použít lag() abyste viděli, kde ostrov začíná, a poté kumulativní součet.

Poslední operací je nějaká agregace (pomocí okenních funkcí):

SELECT p.*, 
      (Max(ends_on) OVER (PARTITION BY location_id, grp) - Min(starts_on) OVER (PARTITION BY location_id, grp) ) + 1 AS duration,
      Array_agg(p.id) OVER (PARTITION BY location_id) 
FROM (SELECT p.*, 
             Count(*) FILTER (WHERE prev_eo < starts_on - INTERVAL '1 day') OVER (PARTITION BY location_id ORDER BY starts_on) AS grp
      FROM (SELECT id, starts_on, ends_on, location_id, holiday_or_vacation_type_id, 
                   lag(ends_on) OVER (PARTITION BY location_id ORDER BY (starts_on)) AS prev_eo
            FROM periods 
           ) p
     ) p;



  1. uváznutí v postgresu na jednoduchý aktualizační dotaz

  2. Která verze MySQL je kompatibilní s Airflow verze 1.10?

  3. JPA:Jak mohu uložit řetězec do databázového pole, zadejte MYSQL Text

  4. Zobrazte každou hodnotu pole DISTINCT pouze jednou pomocí smyčky