我们有一个交易表,其结构如下:
TranxID int (PK and Identity field)
ItemID int
TranxDate datetime
TranxAmt money
Tranxamt可以是正的也可以是负的,所以这个字段(对于任何itemID)的运行总数将随着时间的推移而上下浮动。获取当前总数显然很简单,但我所追求的是一种性能上的方法,当发生这种情况时,可以获得运行总数和事务日期的最高值。请注意,tranxdate不是唯一的,并且由于某些回溯,因此id字段不一定与给定项的tranxdate的顺序相同。
目前,我们正在这样做(@tbltranx是一个仅包含给定项的事务的表变量):
SELECT Top 1 @HighestTotal = z.TotalToDate, @DateHighest = z.TranxDate
FROM
(SELECT a.TranxDate, a.TranxID, Sum(b.TranxAmt) AS TotalToDate
FROM @tblTranx AS a
INNER JOIN @tblTranx AS b ON a.TranxDate >= b.TranxDate
GROUP BY a.TranxDate, a.TranxID) AS z
ORDER BY z.TotalToDate DESC
(tranxid分组删除了由重复日期值引起的问题)
对于一个项目,这给出了发生这种情况时的最高总额和交易日期。我们只在应用程序更新相关条目并将该值记录到另一个表中以供报告时计算该值,而不是在数万条条目中运行该值。
问题是,是否可以用更好的方法来实现这一点,这样我们就可以在不落入RBAR陷阱(有些itemID有数百个条目)的情况下即时计算出这些值(对于多个条目而言)。如果是这样,那么是否可以对其进行调整以获得事务子集的最高值(基于上面未包括的TransactionTypeID)。我目前正在使用SQL Server 2000执行此操作,但SQL Server 2008将很快在这里接管,因此可以使用任何SQL Server技巧。