请参阅问题底部的测试数据..
我有如下数据..
salesorder datee
1 2016-11-10
1 2016-11-10
2 2016-11-09
2 2016-11-09
现在我想显示我的数据,如下所示
datee Summ
2016-11-09 4
2016-11-10 6
所以我使用了下面的查询,这给了我确切的结果
select distinct
datee,
sum(salesorder) over (order by datee)
from
#test
但是上述查询的问题是,它使用 Range 选项并使用磁盘假脱机(如果工作表有记录,那么它是基于磁盘的假脱机),而不是在内存假脱机中。您可以使用下面的方法验证相同的内容
set statistics io on
select distinct
datee,
sum(salesorder) over (order by datee)
from
#test
Table 'Worktable'. Scan count 3, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table '#test_______________________________________________________________________________________________________________00000001A8B8'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
获取 InMemory 假脱机的一种方法是使用如下所示的 Rows 选项
select
datee,
sum(salesorder) over ( order by datee rows between unbounded preceding and current row )
from
#test
上面的查询使用 InMemory spool,速度非常快,但输出不是我想要的..下面是输出
datee summ
2016-11-09 2
2016-11-09 4
2016-11-10 5
2016-11-10 6
与 Disk spool 相比,InMemoryspool 速度非常快。这在此处记录:Microsoft SQL Server 2012 High-Performance T-SQL Using Window Functions (Developer Reference)
所以我的问题是:
我如何使用 InMemory Spool 并获得我想要的结果。我尝试了各种框架选项,但没有得到想要的结果
测试数据:
create table #test
(
salesorder int,
datee date
)
go
insert into #test
select 1,getdate()-1
go 2
insert into #test
select 2,getdate()-2
go 2
注意:
如果我没有重复的日期,则行选项将起作用,但我的数据设置是这样的,并且我有数千条记录,例如示例
更新:
这是大型查询的一部分,因此我更喜欢窗口函数(不带 CTE 或派生表)以避免重写
最佳答案
select distinct T1.dattee,X.Summ from SalesTab T1
CROSS APPLY (SELECT SUM(T2.SalesOrder) SUMM FROM SalesTab T2 WHERE T2.dattee<=T1.dattee) X
ORDER BY T1.Dattee
关于sql - 计算多个日期的运行总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40550925/