PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Намерете редове с отложени периоди от време и натрупайте продължителността им

Това е проблем с пропуски и острови. В този случай можете да използвате lag() за да видите къде започва остров и след това кумулативна сума.

Последната операция е някакво агрегиране (с помощта на прозоречни функции):

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. Използване на функционална нотация в заявки на PostgreSQL вместо точкова нотация

  2. Как да тествате за припокриващи се дати в PostgreSQL

  3. Присъединете се към заявка за броене на generate_series() и извлечете нулеви стойности като '0'

  4. използване на пролетни профили за зареждане с контекстен атрибут на набор от промени на liquibase за управление на обхвата на набор от промени

  5. Изтрийте дублиращи се редове от малка таблица