После столбцов даты начала и окончания - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть столбцы даты начала и окончания, и есть некоторые, где дата начала равна дате окончания предыдущей строки без пробела.Я пытаюсь получить его так, чтобы он в основном шел из строки «Дата начала», чья дата окончания равна нулю, и как бы «зигзагообразно» вверх, пока дата начала не совпадает с датой окончания.

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

1 Ответ

0 голосов
/ 09 апреля 2019

Вы можете определить, где начинаются группы связанных строк, посмотрев, где соседние строки не связаны .Кумулятивная сумма этих запусков затем дает вам группы.

select min(start_dte) as start_dte, max(end_dte) as end_dte
from (select t.*,
             sum(case when prev_end_dte = start_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 t
           ) t
     ) t
group by grp;

Если вы хотите только несколько соединенных строк (как подразумевается вашим вопросом), то добавьте having count(*) > 1 к внешнему запросу.

Здесь - это дБ <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...