sql >> Databasteknik >  >> RDS >> PostgreSQL

Hitta rader med uppskjutande datumintervall och ackumulera deras varaktighet

Detta är ett problem med luckor och öar. I det här fallet kan du använda lag() för att se var en ö börjar och sedan en kumulativ summa.

Den sista operationen är lite aggregering (med fönsterfunktioner):

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. Det går inte att ansluta MySQL-behållare till Tomcat-behållare i docker

  2. Docker-maskin på Mac:Kan inte se monterade volymer på docker-värd/docka-maskin? Var lagras volymer fysiskt?

  3. fe_sendauth:inget lösenord angett fel i postgresql + laravel

  4. Hur gör du det möjligt för kunder att använda sin openid på din webbplats, precis som stackoverflow?