首页 > 解决方案 > 根据自以来的天数分组为系列

问题描述

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

一旦我有了这个,我将按系列分组并获取各个持续时间的 min(StartDate) 和 max(StopDate)。

我可以使用光标来做到这一点,但我确信比我聪明得多的人已经找到了一个更优雅的解决方案。提前致谢!

标签: sqlsql-serverdatesql-server-2008

解决方案


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

例子

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

推荐阅读