2013-10-21 21 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) 

;