PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Znajdź wiersze z odchodzącymi zakresami dat i zsumuj ich czasy trwania

To jest problem luk i wysp. W takim przypadku możesz użyć lag() aby zobaczyć, gdzie zaczyna się wyspa, a następnie skumulowaną sumę.

Ostatnią operacją jest agregacja (przy użyciu funkcji okna):

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawić, by postgresSQL działał na komputerze z systemem Windows 7 z django?

  2. Jak przekazać hasło do pg_dump?

  3. Wybierz dynamiczny zestaw kolumn z tabeli i uzyskaj sumę dla każdej z nich

  4. Podłączanie Pythona do bazy danych Heroku PostgreSQL?

  5. Cloud SQL Postgres Nie znaleziono odpowiedniego sterownika dla jdbc:postgres://google/