根据以下日期划分为系列

时间:2019-01-16 23:17:18

标签: sql sql-server date sql-server-2008

自上次记录以来超过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

一旦我将按系列分组,并获得各个持续时间的最小值(开始日期)和最大值(停止日期)。

我可以使用光标来执行此操作,但是我敢肯定,比我聪明得多的人已经找到了一种更优雅的解决方案。预先感谢!

1 个答案:

答案 0 :(得分:2)

您可以将窗口函数sum() over与条件标记一起使用

示例

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

返回

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