Группировка в серии по дням с - PullRequest
0 голосов
/ 17 января 2019

Мне нужно создавать новую группу каждый раз, когда у меня есть период более 60 дней с момента моей предыдущей записи.

В принципе, мне тоже нужно взять данные, которые у меня есть:

RowNo   StartDate   StopDate    DaysBetween
1   3/21/2017   3/21/2017   14
2   4/4/2017    4/4/2017    14
3   4/18/2017   4/18/2017   14
4   6/23/2017   6/23/2017   66
5   7/5/2017    7/5/2017    12
6   7/19/2017   7/19/2017   14
7   9/27/2017   9/27/2017   70
8   10/24/2017  10/24/2017  27
9   10/31/2017  10/31/2017  7
10  11/14/2017  11/14/2017  14

И превратить это в это:

RowNo   StartDate   StopDate    DaysBetween Series
1   3/21/2017   3/21/2017   14  1
2   4/4/2017    4/4/2017    14  1
3   4/18/2017   4/18/2017   14  1
4   6/23/2017   6/23/2017   66  2
5   7/5/2017    7/5/2017    12  2
6   7/19/2017   7/19/2017   14  2
7   9/27/2017   9/27/2017   70  3
8   10/24/2017  10/24/2017  27  3
9   10/31/2017  10/31/2017  7   3
10  11/14/2017  11/14/2017  14  3

После этого я сгруппируюсь по сериям и получу минимальную (StartDate) и максимальную (StopDate) для отдельных длительностей.

Я мог бы сделать это с помощью курсора, но я уверен, что кто-то намного умнее меня нашел более элегантное решение. Заранее спасибо!

1 Ответ

0 голосов
/ 17 января 2019

Вы можете использовать оконную функцию sum() over с условным FLAG

Пример

Select *
     ,Series= 1+sum(case when [DaysBetween]>60 then 1 else 0 end) over (Order by RowNo)
 From YourTable

Returns

RowNo   StartDate   StopDate    DaysBetween Series
1       2017-03-21  2017-03-21  14          1
2       2017-04-04  2017-04-04  14          1
3       2017-04-18  2017-04-18  14          1
4       2017-06-23  2017-06-23  66          2
5       2017-07-05  2017-07-05  12          2
6       2017-07-19  2017-07-19  14          2
7       2017-09-27  2017-09-27  70          3
8       2017-10-24  2017-10-24  27          3
9       2017-10-31  2017-10-31  7           3
10      2017-11-14  2017-11-14  14          3

РЕДАКТИРОВАТЬ - Версия 2008

Select A.*
      ,B.*
 From  YourTable A
 Cross Apply (
               Select Series=1+sum( case when [DaysBetween]>60 then 1 else 0 end) 
                From  YourTable
                Where RowNo <= A.RowNo
             ) B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...