【发布时间】:2010-10-26 01:08:54
【问题描述】:
想象一下下表(称为TestTable):
id somedate somevalue
-- -------- ---------
45 01/Jan/09 3
23 08/Jan/09 5
12 02/Feb/09 0
77 14/Feb/09 7
39 20/Feb/09 34
33 02/Mar/09 6
我想要一个按日期顺序返回运行总计的查询,例如:
id somedate somevalue runningtotal
-- -------- --------- ------------
45 01/Jan/09 3 3
23 08/Jan/09 5 8
12 02/Feb/09 0 8
77 14/Feb/09 7 15
39 20/Feb/09 34 49
33 02/Mar/09 6 55
我知道在 SQL Server 2000 / 2005 / 2008 中有 various ways of doing this。
我对这种使用聚合集语句技巧的方法特别感兴趣:
INSERT INTO @AnotherTbl(id, somedate, somevalue, runningtotal)
SELECT id, somedate, somevalue, null
FROM TestTable
ORDER BY somedate
DECLARE @RunningTotal int
SET @RunningTotal = 0
UPDATE @AnotherTbl
SET @RunningTotal = runningtotal = @RunningTotal + somevalue
FROM @AnotherTbl
... 这非常有效,但我听说这方面存在一些问题,因为您不一定能保证 UPDATE 语句会以正确的顺序处理行。也许我们可以得到一些关于这个问题的明确答案。
但也许人们可以提出其他建议?
编辑:现在使用SqlFiddle 设置和上面的“更新技巧”示例
【问题讨论】:
-
blogs.msdn.com/sqltips/archive/2005/07/20/441053.aspx 将订单添加到您的更新...集,您将获得保证。
-
但是 Order by 不能应用于 UPDATE 语句...可以吗?
-
另请参阅sqlperformance.com/2012/07/t-sql-queries/running-totals,尤其是如果您使用的是 SQL Server 2012。
标签: sql sql-server tsql cumulative-sum