Excel 运行 总计 / window 函数

Excel running total / window function

假设我们有一些数据如下

Datetime             Type  Sale
25/07/2016 03:21      A     12
25/07/2016 04:00      B     23
25/07/2016 15:20      B     5
26/07/2016 05:15      A     15
26/07/2016 10:20      A     3
26/07/2016 16:10      B     20
27/07/2016 10:10      B     5

.......

问题是 "Find the 36-hour frame where we have the largest total sales of type A product" 使用 Excel

根据我的理解,如果我尝试接近它,36 小时的框架对每个条目来说意味着,我们将从那一点开始查看框架。例如,以第一个条目为例,以它开始的帧将是 25/07/2016 03:21 -> 26/07/2016 15:21,1.5 天后,这意味着此帧的总和为 12 +15+3。晚于或早于正在考虑的条目采取任何措施都会减少总和,不是吗?以每个条目为起点,您的总和 'spans the furthest'.

  1. 对我来说,它看起来像是 SQL 中的加窗求和。您将如何仅使用 Excel 找到解决方案?

  2. 如果能在SQL中也提供解决方案就好了

谢谢。

您需要提供更多有关 36 小时 window 工作方式的详细信息;是任意的 26 小时 window 还是他们设置了具有定义起点和终点的间隔?如果是后者,您只能使用额外的日期时间周期 table 来计算总和。

然而,对于前者,您可以查看每次销售前后的 36 小时时间段,然后找出这些值的最大值。最简单的方法是在 excel 中使用 Table 和以下 SUMIFS 公式,这些公式查找与日期时间值为 36 小时的行中相同类型的所有销售(1.5 天)在给定行中的日期时间值之前或之后:

首先选择您的数据,然后插入 Table:

然后添加两列并输入以下公式:

前 36 小时:
=SUMIFS([销售],[类型],[@Type],[日期时间],">"&[@Datetime]-1.5,[日期时间],"<="&[@Datetime])

接下来的 36 小时:
=SUMIFS([销售],[类型],[@Type],[日期时间],"<"&[@Datetime]+1.5,[日期时间],">="&[@Datetime])

要在 SQL 中使用日期时间值的 36 小时周期执行此操作,您可以使用以下内容。我已经包括了之前和之后的 36 小时时间段,因为只朝一个方向看会错过数据集开始或结束时的销售情况。窗口函数不允许您指定数据驱动 windows 因此您需要使用连接或子选择来实现您所追求的目标:

declare @data table(dt Datetime, Type nvarchar(50), Sale int)
insert into @data
values
 ('2016/07/25 03:21','A',12)
,('2016/07/25 04:00','B',23)
,('2016/07/25 15:20','B',5)
,('2016/07/26 05:15','A',15)
,('2016/07/26 10:20','A',3)
,('2016/07/26 16:10','B',20)
,('2016/07/27 10:10','B',5)

select a.dt
        ,a.Type
        ,a.Sale
        ,sum(dprev.Sale) as PrevSales
        ,a.NextSales
from(
    -- If you only want the proceeding 36 hour period you can just use this part --
    select d.dt
            ,d.Type
            ,d.Sale
            ,sum(dnext.Sale) as NextSales
    from @data d
        left join @data dnext
            on(d.Type = dnext.Type
                and dnext.dt between d.dt and dateadd(hour,+36,d.dt)
                )
    group by d.dt
            ,d.Type
            ,d.Sale
    -------------------------------------------------------------------------------
) a
    left join @data dprev
        on(a.Type = dprev.Type
            and dprev.dt between dateadd(hour,-36,a.dt) and a.dt
            )
group by a.dt
        ,a.Type
        ,a.Sale
        ,a.NextSales
order by a.Type
        ,a.dt

用下面的公式写在E2中
=SUMIFS($C:$C,$B:$B,"=A",$A:$A,">="&A2,$A:$A,"<"&A2+1.5)