sql - 根据自以来的天数分组为系列
问题描述
每次自上次记录以来的时间超过 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)。
我可以使用光标来做到这一点,但我确信比我聪明得多的人已经找到了一个更优雅的解决方案。提前致谢!
解决方案
您可以将窗口函数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
推荐阅读
- macos - 在不使用 FFSFindFolder 的情况下找到 MacOS X Framework 文件夹
- java - QGIS/JOSM/GOOGLE MAP API:一种过滤方式(Highway=street_light)并将其保存在 CSV 文件中
- android - 我只想在单击按钮时读取 NFC
- php - 如何从标题中的数据库中获取所有类别?
- django - Django ForeignKey过滤整个对象或object_id
- python - 如果满足某个条件,如何使用计数器?
- java - 使用 JPA 的 Spring Boot 数据源配置
- selenium - 如何使用我正在获取 StaleElementReferenceException 的 selenium 执行单击元素
- python - 使用带有 SSL 的 ibm_db 连接到 DB2 时出错
- swift - foo 循环行为怪异