2012-05-22 136 views
0

我有一個查詢返回請求的數量,以不同的對象按日期採樣, 每天可以有多個採樣器。 With部分在開始時每天只用於獲取最新樣本。SQL Server - 獲取總和減去前一行的總和

With RankedSamples As 
    (
    Select Id, runend 
     , ROW_NUMBER() OVER(PARTITION BY convert(varchar , runEnd, 1) ORDER BY runEnd DESC) ItemRank 
    From t_SamplesRuns 
    where runend > '05/13/12' and runend < '05/18/12' 
    ) 

select sum(TotalRequests) Hits, 
     convert(nvarchar(10), day(smp.date)) + '-' + 
     convert(nvarchar(10), month(smp.date)) + '-' + 
     convert(nvarchar(10), year(smp.date)) date 
from t_samples smp 
where smp.runid in (     
    select id     
    from RankedSamples     
    where ItemRank = 1 
    )  

group by convert(nvarchar(10), day(smp.date)) + '-' + 
     convert(nvarchar(10), month(smp.date)) + '-' + 
     convert(nvarchar(10), year(smp.date)) 

這是什麼返回的是例如:

Hits  date 
111111 13-5-2012 
222222 14-5-2012 
333333 15-5-2012 
444444 16-5-2012 
555555 17-5-2012 

什麼,我需要它返回的這些字段+命中的來自前一天的數量和它們的減法(第一行irelevant):

Hits  date  Prev  Res 
111111 13-5-2012 0  111111 
222223 14-5-2012 111111 111112 
333335 15-5-2012 222223 111113 
444447 16-5-2012 333335 111114 
555559 17-5-2012 444447 111115 

有什麼想法? 謝謝!

回答

2

假設你沒有使用SQL Server 2012,你要做的是實現一個滯後函數。不幸的是,最簡單的方法是自我加入。所以,我要重寫查詢做到這一點:

With RankedSamples As (
     Select Id, runend, 
      ROW_NUMBER() OVER(PARTITION BY convert(varchar , runEnd, 1) ORDER BY runEnd DESC) as ItemRank 
     From t_SamplesRuns 
     where runend > '05/13/12' and runend < '05/18/12' 
    ) 
    Results as (
     select sum(TotalRequests) Hits, 
      convert(nvarchar(10), day(smp.date)) + '-' + convert(nvarchar(10), month(smp.date)) + '-' +   convert(nvarchar(10), year(smp.date)) as date 
     from t_samples smp where smp.runid in (select id from RankedSamples where ItemRank = 1) 
     group by convert(nvarchar(10), day(smp.date)) + '-' + convert(nvarchar(10), month(smp.date)) + '-' + convert(nvarchar(10), year(smp.date) 
    ), 
    Results2 as (
     select r.*, row_number() over (partition by null order by date) as rownum 
     from Results 
    ) 
select r.hits, r.date, rprev.hits, r.hits - rprev.hits 
from Results2 r left outer join 
    Results2 rprev 
    on r.rownum = rprev.rownum+1 

正如我所說的,這是SQL Server 2012中更容易,因爲窗口的功能更類似於Oracle的解析函數。

+0

美麗!謝謝! – Igal