sql >> Database teknologi >  >> RDS >> PostgreSQL

Find rækker med udskydende datointervaller, og akkumuler deres varigheder

Dette er et problem med huller og øer. I dette tilfælde kan du bruge lag() for at se, hvor en ø starter og derefter en kumulativ sum.

Den sidste operation er en vis aggregering (ved hjælp af vinduesfunktioner):

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. PHP 7 kan ikke finde MySQLi

  2. SQL-ydeevne:WHERE vs WHERE(ROW_NUMBER)

  3. SQL:Sådan vælger du én post pr. dag, forudsat at hver dag indeholder mere end 1 MySQL-værdi

  4. procedure i mysql