【问题标题】:Grouping into series based on days since根据自以来的天数分组
【发布时间】:2019-06-11 02:46:55
【问题描述】:

每当我从上一次记录以来的时间超过 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)。

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

【问题讨论】:

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


    【解决方案1】:

    您可以将窗口函数 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
    

    【讨论】:

    • 。 .这没有 XML。你不应该回答它;)
    • @GordonLinoff 我是一个兴趣广泛的人。例如,我写“我的小马驹”同人小说 :)
    • 谢谢,我从未在 SUM 上使用过 OVER 部分。有道理,但是使用上面的示例 SQL,我在“订单”消息附近得到了一个不正确的语法。我应该使用按子句分区吗?我在 MS SQL Server 2008 R2 上
    • @WSaunders 如果列“order”,那么您需要记住“ORDER”是保留字,并且必须被视为 [Order] ... 带括号。现在,另一方面,窗口函数 sum() over 是在 2012 年推出的。您使用的是哪个版本?
    • MS SQL Server 2008 R2 :(
    猜你喜欢
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多