Hai, saya sarankan menggunakan proses berikut:
1- Identifikasi saat baris baru, sehingga Anda memberikan nilai 1 untuk nilai yang tidak tumpang tindih (CTE b)
2- Urutkan bersama baris yang tumpang tindih dengan yang lain. Dengan cara ini Anda dapat melihat memiliki pengenal umum yang memungkinkan Anda untuk MAX dan MIN begat dan endat (CTE c)
3- Untuk setiap urutan, berikan MIN dari begat dan MAX dari endat sehingga Anda akan memiliki nilai akhir Anda
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