我有以下查询,它给出了投资组合的每日总价值。
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/2013
和1/10/2013
之间的差异,依此类推每行。
我通常在桌面上使用别名INNER JOIN
ON
执行ID - 1
并根据需要执行计算。不幸的是,在按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 :(得分: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)
;