首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算多个日期的运行总计

计算多个日期的运行总计
EN

Stack Overflow用户
提问于 2016-11-11 15:17:07
回答 2查看 110关注 0票数 2

关于测试数据,请看下面的问题。

我有如下数据..。

代码语言:javascript
复制
salesorder  datee
1          2016-11-10
1          2016-11-10
2          2016-11-09
2          2016-11-09

现在我想像下面这样显示我的数据

代码语言:javascript
复制
datee       Summ
2016-11-09  4
2016-11-10  6

所以我使用了下面的查询,它给出了准确的结果

代码语言:javascript
复制
select distinct 
datee,
sum(salesorder) over (order by datee)
from
#test

但是上面的查询的问题是,它使用Range选项并使用磁盘假脱机(如果工作表有记录,那么它是基于磁盘的假脱机),而不是在内存中,spool..You可以使用下面的方法验证相同的情况。

代码语言:javascript
复制
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假脱机的一种方法是使用行选项,如下所示

代码语言:javascript
复制
select 
datee,
sum(salesorder) over ( order by datee rows between  unbounded preceding and  current row )
from
#test

上面的查询使用InMemory假脱机,速度非常快,但输出不是i want..below的输出。

代码语言:javascript
复制
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池并得到我想要的结果。我尝试了各种框架选项,但我没有得到想要的结果。

测试数据:

代码语言:javascript
复制
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或派生表)以避免重写。

EN

回答 2

Stack Overflow用户

发布于 2016-11-11 15:34:02

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-11-11 15:35:00

如何使用这个:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40550925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档