关于测试数据,请看下面的问题。
我有如下数据..。
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选项并使用磁盘假脱机(如果工作表有记录,那么它是基于磁盘的假脱机),而不是在内存中,spool..You可以使用下面的方法验证相同的情况。
set statistics io on
select distinct
datee,
sum(salesorder) over (order by datee)
from
#test表‘工作表’。扫描计数3,逻辑读取21,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.表'#test_______________________________________________________________________________________________________________00000001A8B8'.扫描计数1,逻辑读取1,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.
获取InMemory假脱机的一种方法是使用行选项,如下所示
select
datee,
sum(salesorder) over ( order by datee rows between unbounded preceding and current row )
from
#test上面的查询使用InMemory假脱机,速度非常快,但输出不是i want..below的输出。
datee summ
2016-11-09 2
2016-11-09 4
2016-11-10 5
2016-11-10 6与磁盘相比,InMemoryspool的速度非常快,这里记录了spool.this:使用窗口函数的Microsoft 2012高性能T(开发人员参考)
所以我的问题是:
我如何使用InMemory池并得到我想要的结果。我尝试了各种框架选项,但我没有得到想要的结果。
测试数据:
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或派生表)以避免重写。
发布于 2016-11-11 15:34:02
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发布于 2016-11-11 15:35:00
如何使用这个:
SELECT datee,
sum(salesorder) over
( order by datee rows between unbounded preceding and current row )
FROM (
SELECT datee,
sum(salesorder) as salesorder
from #test
GROUP BY datee
) t这说明了以下几点:
桌子‘工作表’扫描计数0,逻辑读取0,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.表'#test_______________________________________________________________________________________________________________0000000000A3'.扫描计数1,逻辑读取1,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.
编辑:
如果您不想使用这种技术,那么尝试使用Row_NUMBER()对您自己的查询进行包装,仍然使用IN Memeory: 选择datee,salesorder FROM (选择datee,salesorder,ROW_NUMBER() over (按日期顺序划分由salesorder划分)作为RN (选择datee,sum( salesorder ) OVER (按日期排序,在前一段和当前行之间按行顺序)作为salesorder从#test ) t1 ) t2,其中RN =1
https://stackoverflow.com/questions/40550925
复制相似问题