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'.
对我来说,它看起来像是 SQL 中的加窗求和。您将如何仅使用 Excel 找到解决方案?
如果能在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)
假设我们有一些数据如下
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'.
对我来说,它看起来像是 SQL 中的加窗求和。您将如何仅使用 Excel 找到解决方案?
如果能在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)