我有一个包含ID、日期和值的表.我希望始终根据ID合并90天窗口内的记录.在下面的示例中,这些是用相同 colored颜色 标记的行.

origin

最终结果应该如下所示:

endresult

行ID为1的条目将打开ID为133741的90天窗口.RowID 2和3在此窗口中,因此应与RowID 1聚合在一起.

RowID 4将与2和3一起位于90天窗口中,但由于它位于1的窗口之外,因此不应再与它们合计,而应视为新的90天窗口的开始.由于此窗口中没有其他条目,因此它仍为一行.

第5行的日期显然超出了其他条目的90天窗口,因此也是单独汇总的.就像第6行一样,因为这是一个不同的ID.

下面是一些示例代码:


create table #Table(RowId int, ID nvarchar(255) , Date date, Amount numeric(19,1));
insert into #Table values


(1,'133742',    '2021-07-30',   1.00    ),
(2,'133742',    '2021-08-05',   3.00    ),
(3,'133742',    '2021-08-25',   10.00   ),
(4,'133742',    '2021-11-01',   7.00    ),
(5,'133742',    '2022-08-25',   11.00   ),
(6,'133769',    '2021-11-13',   9.00    );

我try 了窗口函数和CTE,但我找不到一种方法来包含我的所有需求

推荐答案

利用窗口函数first_value() over(),我们计算以天为单位的距离除以90,以得到推导出的Grp

Example

with cte as (
Select *
      ,Grp = datediff(day,first_value(Date) over (partition by id order by date) ,date) / 90
 from #Table
 )
 Select ID 
       ,Date = min(date)
       ,Amount = sum(Amount)
 From  cte
 Group By ID,Grp
 Order by ID,min(date)

Results

ID      Date        Amount
133742  2021-07-30  14.0
133742  2021-11-01  7.0
133742  2022-08-25  11.0
133769  2021-11-13  9.0

Sql相关问答推荐

在数据分区内执行确定

BigQuery`喜欢ANY‘和`不喜欢ANY’

前面的语句不喜欢AND LIKE?当try 更新使用ID和日期过滤的表时

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

在多个柱上连接时,如何确定连接条件?

如何根据计数和分组获取订单总数

通过之前的连接-这是Oracle的错误吗?

使用Kotlin Exposed SQL DSL Select 多个值并排序

如果多行科目有一行在指定的日期范围内,如何 Select 该科目在该日期之前的所有行?

在SQL中为两个日期之间的每个日期添加行

用VB.NET在Dapper中实现MS Access数据库顺序透视

用于SQL协助的XQUERY()

Select 组中的第一行,但在并发环境中

如何为 ActiveRecord 联接应用附加条件

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

自动生成计算频率的列

从每行中排除最大元素

如何在 RavenDB Studio (RQL) 中插入更新文档

来自 SQL Server 的树层次 struct 图的 JSON

当没有任何行存在时,将一个表中的行插入到另一个表中的更好方法