Này, tôi khuyên bạn nên sử dụng quy trình sau:
1- Xác định thời điểm một hàng là hàng mới, vì vậy bạn đặt giá trị 1 cho các giá trị không trùng lặp (CTE b)
2- Trình tự các hàng trùng lặp với các hàng khác với nhau. Bằng cách này, bạn có thể thấy một số nhận dạng chung sẽ cho phép bạn MAX và MIN đầu tiên và kết thúc (CTE c)
3- Đối với mỗi trình tự, cung cấp MIN của nội dung và MAX của nội dung để bạn có các giá trị cuối cùng của mình
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