2016-11-11 72 views
2

請參閱有關測試數據的問題的底部..計算運行總和的多個日期

我有一個像下面的數據..

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 

但上述查詢的問題是,它使用範圍選項並使用磁盤假脫機(如果工作表有記錄,那麼它是基於磁盤的假脫機),而不是在內存假脫機中。您可以使用下面的驗證相同

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閥芯和速度非常快,但輸出是不是我want..below是輸出

datee  summ 
2016-11-09 2 
2016-11-09 4 
2016-11-10 5 
2016-11-10 6 

InMemoryspool是非常快的比較磁盤spool.this記錄在這裏:Microsoft SQL Server 2012 High-Performance T-SQL Using Window Functions (Developer Reference)

所以我的問題是:
如何使用InMemory閥芯和得到的結果與我不同的取景選擇want.I嘗試過,但我沒有得到期望的結果

測試數據:

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或派生表),以避免重寫

+0

你嘗試過不同的選擇日期CROSS應用到日e銷售訂單的總和? – Cato

+0

我想,即使我使用交叉應用不同的日期,我不會得到累計總和,進一步這是一個大型查詢的一部分,所以我更喜歡窗口函數,以避免重寫 – TheGameiswar

+0

如果您將派生表放入CTE ,不會避免重寫? –

回答

1
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

如何有關使用該:

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:

SELECT datee, salesorder 
FROM (
     SELECT datee, salesorder, 
      ROW_NUMBER() OVER (PARTITION BY datee ORDER BY salesorder DESC) AS RN 
     FROM (
       SELECT datee, 
         sum(salesorder) over (order by datee rows between unbounded preceding and current row) As salesorder 
       FROM #test 
     ) t1 
) t2 
WHERE RN = 1 
+0

我有這個解決方案,但我不想以這種方式訪問​​由於許多原因。謝謝 – TheGameiswar

+0

@ TheGameiswar也許你可以詳細說明爲什麼不,因此其他人不會給出類似的答案? –

+0

@TheGameiswar更新替代方法 –