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

Обединяване на припокриващи се времеви интервали, как?

Можете също така да опитате тази заявка (още веднъж решения освен дадените от PM 77-1 в коментара по-горе) :

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;

Демо ---> http://www.sqlfiddle.com/#!12/ bdf7e/9

за огромна таблица обаче изпълнението на тази заявка може да е ужасно бавно и някои процедурни подходи може да работят по-добре.




  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 в Shell или променлива на PostgreSQL

  2. Защо моята база данни на Postgres работи известно време и след това не може да стартира сървъра, след като бъде рестартиран?

  3. базата данни за преименуване на postgres не работи

  4. Как да инсталирате PostgreSQL 12 на Fedora 33

  5. Как мога безопасно да препратя поредица от първичен ключ в Django?