【问题标题】:Group over dynamic date ranges对动态日期范围进行分组
【发布时间】:2023-01-28 01:31:55
【问题描述】:

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

最终结果应如下所示:

RowId 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'  );

我尝试使用窗口函数和 CTE,但找不到包含我所有要求的方法

【问题讨论】:

    标签: sql sql-server tsql date-range


    【解决方案1】:

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

    例子

    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)
    

    结果

    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
    

    【讨论】:

      猜你喜欢
      • 2016-01-09
      • 2013-01-28
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 2019-02-19
      • 1970-01-01
      相关资源
      最近更新 更多