Объединять строки, если столбцы даты перекрываются в TSQL - PullRequest
2 голосов
/ 07 мая 2019

У меня есть таблица в следующем формате

Id  StartDate   EndDate Type
1   2012-02-18  2012-03-18  1
1   2012-03-19  2012-06-19  1
1   2012-06-27  2012-09-27  1
1   2014-08-23  2014-09-24  3
1   2014-09-23  2014-10-24  3
1   2014-10-23  2014-11-24  3
2   2015-07-04  2015-08-06  1
2   2015-08-04  2015-09-06  1
3   2013-11-01  2013-12-01  0
3   2018-01-09  2018-02-09  0

Я нашел подобные вопросы здесь, но не то, что могло бы помочь мне решить мою проблему.Я хочу объединить строки с одинаковыми Id, Type и перекрывающимися периодами дат.Однако, если есть разрыв между предыдущими EndDate и StartDate 14 днями, я хочу считать его перекрывающимся.

Результат из приведенной выше таблицы должен быть

Id  StartDate   EndDate Type
1   2012-02-18  2012-09-27  1
1   2014-08-23  2014-11-24  3
2   2015-07-04  2015-09-06  1
3   2013-11-01  2013-12-01  0
3   2018-01-09  2018-02-09  0

На другом сервере я смог сделать это со следующими ограничениями и запросом ниже:

  • Не проверял разрыв между перекрывающимися датами
  • Не заботилосьо столбце Type, но только Id
  • Если бы была более новая версия SQL Server (2012), но теперь у меня есть 2008, код которого не совместим

SELECT Id
     , MIN(StartDate) AS StartDate
     , MAX(EndDate) AS EndDate
FROM (
    SELECT *
         , SUM(CASE WHEN a.EndDate = a.StartDate THEN 0
                    ELSE 1
               END
           ) OVER (ORDER BY Id, StartDate) sm
    FROM (
        SELECT Id
             , StartDate
             , EndDate
             , LAG(EndDate, 1, NULL) OVER (PARTITION BY Id ORDER BY Id, EndDate) EndDate
        FROM #temptable
    ) a
) b
GROUP BY Id, sm

Любой совет, как я могу

  • Включить тип в процесс
  • Учитывать разрыв в 14 дней при перекрытии
  • Сделать так, чтобы это работалона SQL Server 2008

1 Ответ

0 голосов
/ 07 мая 2019
create table #table
(Id int,StartDate date,  EndDate date, Type int)

insert into #table
values

('1','2012-02-18','2012-03-18','1'),('1','2012-03-19','2012-06-19','1'),
('1','2012-06-27','2012-09-27','1'),('1','2014-08-23','2014-09-24','3'),
('1','2014-09-23','2014-10-24','3'),('1','2014-10-23','2014-11-24','3'),
('2','2015-07-04','2015-08-06','1'),('2','2015-08-04','2015-09-06','1'),
('3','2013-11-01','2013-12-01','0'),('3','2018-01-09','2018-02-09','0')

select ID,MIN(startdate)sd,MAX(EndDate)ed,type from #table
group by ID,TYPE,YEAR(startdate),YEAR(EndDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...