Hej, jeg vil foreslå at bruge følgende proces:
1- Identificer, hvornår en række er ny, så du giver en værdi på 1 til værdier, der ikke overlapper (CTE b)
2- Sæt rækkerne sammen, der har overlapninger med andre. På denne måde kan du se, at du har en fælles identifikator, der giver dig mulighed for at MAX og MIN begat og endat (CTE c)
3- For hver sekvens skal du angive MIN for begat og MAX for endat, så du har dine endelige værdier
WITH a AS (
select '2017-09-16 07:12:57' as begat,'2017-09-16 11:30:22' as endat
union
select '2017-09-18 17:05:21' ,'2017-09-19 13:18:01'
union
select '2017-09-19 15:34:40' ,'2017-09-22 13:29:37'
union
select '2017-09-22 12:24:16' ,'2017-09-22 13:18:29'
union
select '2017-09-28 09:48:54' ,'2017-09-28 13:39:13'
union
select '2017-09-20 13:52:43' ,'2017-09-20 14:14:43'
)
, b AS (
SELECT
begat
, endat
, (begat > MAX(endat) OVER w IS TRUE)::INT is_new
FROM a
WINDOW w AS (ORDER BY begat ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
)
, c AS (
SELECT
begat
, endat
, SUM((is_new)) OVER (ORDER BY begat) seq
FROM b
)
SELECT
MIN(begat) beg_at
, MAX(endat) end_at
FROM c
GROUP BY seq