2013-10-21 17 views
1

我有以下查詢可以給出投資組合的每日總價值。查詢以計算SUM和以前的SUM,GROUP BY不連續日期之間的差異

SELECT RecDate, Sum(Mval) as TotalVal 
FROM DailyVal 
WHERE RecDate >= DateValue("1/1/2013") 
GROUP BY RecDate; 

它的偉大工程,並給出結果如下:

RecDate TotalVal 
1/10/2013 4465 
1/11/2013 4471 
1/14/2013 4472 
1/15/2013 4477 

不過,我想計算的發言權1/11/20131/10/2013等的每一行之間的差異。

我通常在別名表ONID - 1上做一個INNER JOIN並根據需要執行計算。不幸的是,當通過GROUP BY進行彙總時,沒有一個合理的索引。

我的問題是有沒有實際給的索引查詢的方式,因此它可以是這樣的:

ID RecDate TotalVal 
1 1/10/2013 4465 
2 1/11/2013 4471 
3 1/14/2013 4472 
4 1/15/2013 4477 

這樣我可以把我的正常做法。

否則,是否有更有效的方式來執行此任務?

回答

0

你應該能夠與一個子查詢和爲此自聯接:

SELECT 
    D1.RecDate, 
    TotalVal, 
    TotalVal - NZ(TotalVal2,0) Delta 
FROM (
    SELECT RecDate, Sum(Mval) as TotalVal 
    FROM DailyVal 
    WHERE RecDate >= DateValue("1/1/2013") 
    GROUP BY RecDate) D1 
LEFT JOIN (
    SELECT RecDate, Sum(Mval) as TotalVal2 
    FROM DailyVal 
    WHERE RecDate >= DateValue("1/1/2013") 
    GROUP BY RecDate) D2 
ON D2.RecDate = (SELECT MAX(RecDate) FROM DailyVal WHERE RecDate < D1.RecDate) 

;