PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak scalić nakładające się przedziały czasu?

Możesz również wypróbować to zapytanie (jeszcze raz rozwiązania poza tymi podanymi przez PM 77-1 w komentarzu powyżej) :

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

jednak w przypadku dużej tabeli wydajność tego zapytania może być strasznie niska, a niektóre podejścia proceduralne mogą działać lepiej.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Powolne LEFT JOIN na CTE z interwałami czasowymi

  2. Jak zrzucić PGresult dla poleceń innych niż SELECT?

  3. Dopasowywanie wzorców między wieloma kolumnami

  4. PL/pgSQL wykonaj vs wykonaj

  5. Jak skonfigurować źródło danych SSL Spring/Heroku/postgres?