Hé, je suggérerais d'utiliser le processus suivant :
1- Identifiez quand une ligne est nouvelle, vous donnez donc une valeur de 1 aux valeurs qui ne se chevauchent pas (CTE b)
2- Séquencez ensemble les rangs qui se chevauchent avec les autres. De cette façon, vous pouvez voir avoir un identifiant commun qui vous permettra de MAX et MIN begat et endat (CTE c)
3- Pour chaque séquence, donnez le MIN de begat et le MAX de endat pour avoir vos valeurs finales
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