У меня есть столбцы даты начала и окончания, и есть некоторые, где дата начала равна дате окончания предыдущей строки без пробела.Я пытаюсь получить его так, чтобы он в основном шел из строки «Дата начала», чья дата окончания равна нулю, и как бы «зигзагообразно» вверх, пока дата начала не совпадает с датой окончания.
Iпробовал CTE и ROW_NUMBER () OVER ().
START_DTE END_DTE
2018-01-17 2018-01-19
2018-01-26 2018-02-22
2018-02-22 2018-08-24
2018-08-24 2018-09-24
2018-09-24 NULL
Ожидается:
START_DTE END_DTE
2018-01-26 2018-09-24
РЕДАКТИРОВАТЬ
Использование предложенного решенияс добавленным CTE, чтобы гарантировать, что даты не имеют времени с ними.
WITH
CTE_TABLE_NAME AS
(
SELECT
ID_NUM,
CONVERT(DATE,START_DTE) START_DTE,
CONVERT(DATE,END_DTE) END_DTE
FROM
TABLE_NAME
WHERE ID_NUM = 123
)
select min(start_dte) as start_dte, max(end_dte) as end_dte, grp
from (select t.*,
sum(case when prev_end_dte = end_dte then 0 else 1 end) over (order by start_dte) as grp
from (select t.*,
lag(end_dte) over (order by start_dte) as prev_end_dte
from CTE_TABLE_NAME t
) t
) t
group by grp;
Следующий запрос предоставляет эти результаты:
start_dte end_dte grp
2014-08-24 2014-12-19 1
2014-08-31 2014-09-02 2
2014-09-02 2014-09-18 3
2014-09-18 2014-11-03 4
2014-11-18 2014-12-09 5
2014-12-09 2015-01-16 6
2015-01-30 2015-02-02 7
2015-02-02 2015-05-15 8
2015-05-15 2015-07-08 9
2015-07-08 2015-07-09 10
2015-07-09 2015-08-25 11
2015-08-31 2015-09-01 12
2015-10-06 2015-10-29 13
2015-11-10 2015-12-11 14
2015-12-11 2015-12-15 15
2015-12-15 2016-01-20 16
2016-01-29 2016-02-01 17
2016-02-01 2016-03-03 18
2016-03-30 2016-08-29 19
2016-08-30 2016-12-06 20
2017-01-27 2017-02-20 21
2017-02-20 2017-08-15 22
2017-08-15 2017-08-29 23
2017-08-29 2018-01-17 24
2018-01-17 2018-01-19 25
2018-01-26 2018-02-22 26
2018-02-22 2018-08-24 27
2018-08-24 2018-09-24 28
2018-09-24 NULL 29
Я пытался использовать счетчик (*)> 1как предложено, но это не дало никаких результатов
Ожидаемый пример
START_DTE END_DTE
2017-01-27 2018-01-17
2018-01-26 2018-09-24