अरे, मैं निम्नलिखित प्रक्रिया का उपयोग करने का सुझाव दूंगा:
1- पहचानें कि कोई पंक्ति कब नई है, इसलिए आप उन मानों को 1 का मान देते हैं जो ओवरलैप नहीं होते हैं (CTE b)
2- उन पंक्तियों को एक साथ अनुक्रमित करें जो दूसरों के साथ ओवरलैप होती हैं। इस तरह आप देख सकते हैं कि एक सामान्य पहचानकर्ता है जो आपको MAX और MIN की शुरुआत और समाप्ति (CTE c)
की अनुमति देगा।3- प्रत्येक अनुक्रम के लिए, मिन ऑफ़ बेगेट और मैक्स ऑफ़ एंडैट दें ताकि आपके पास अपने अंतिम मान हों
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