PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Temukan baris dengan rentang tanggal yang ditunda dan kumpulkan durasinya

Ini adalah masalah kesenjangan dan pulau. Dalam hal ini Anda dapat menggunakan lag() untuk melihat di mana sebuah pulau dimulai dan kemudian jumlah kumulatifnya.

Operasi terakhir adalah beberapa agregasi (menggunakan fungsi jendela):

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. Heroku Postgres DB lebih lambat setelah peningkatan

  2. Bagaimana cara menggunakan Spring StandardPasswordEncode dan Get Salt Generate?

  3. Daftar tabel dalam skema Postgres menggunakan R

  4. Menemukan posisi nilai dalam array PostgreSQL

  5. INSERT atau UPDATE data massal dari dataframe/CSV ke database PostgreSQL