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

Menggabungkan interval waktu yang tumpang tindih, bagaimana?

Anda juga dapat mencoba kueri ini (sekali lagi solusi selain yang diberikan oleh PM 77-1 di komentar di atas) :

WITH RECURSIVE cte( id, date_start, date_end ) AS
(
  SELECT id, date_start, date_end
  FROM evento
  UNION 
  SELECT e.id,
         least( c.date_start, e.date_start ),
         greatest( c.date_end, e.date_end )
  FROM cte c
  JOIN evento e
  ON e.date_start between c.date_start and c.date_end
     OR 
     e.date_end between c.date_start and c.date_end
)
SELECT distinct date_start, date_end
FROM (
  SELECT id, 
         min( date_start) date_start, 
         max( date_end ) date_end
  FROM cte
  GROUP BY id
) xx
ORDER BY date_start;

Demo ---> http://www.sqlfiddle.com/#!12/ bdf7e/9

namun untuk tabel besar, kinerja kueri ini bisa sangat lambat, dan beberapa pendekatan prosedural mungkin berkinerja lebih baik.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi lower() pada karakter internasional di postgresql

  2. Menerapkan Postgres Sql di Apache Airflow

  3. Cara memilih dari variabel yang merupakan nama tabel n Postgre>=9.2

  4. Pengurutan Ulang Catatan PostgreSQL menggunakan Pembaruan dengan Sub-Pilih

  5. Mengapa PostgreSQL menganggap batas NULL dalam tipe rentang berbeda dari batas tak terbatas?