在静态表上,我尝试在 SSMS 中运行以下查询(以获取每个用户的最新交易并对美元值(value)求和):
SELECT
SUM(nMoney) As TotalMoney
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY nGroup, nUser ORDER BY dTransaction DESC) AS SEQNUM
, nMoney
FROM [MyDB].[dbo].[MyTable]
) MySubquery
WHERE MySubquery.SEQNUM=1
这是一个包含 2,701,510 行的表,nMoney 列的类型为 Decimal(12,2)。当我多次运行它时,我得到不同的结果:
2317367341.75
2317370443.45
2317449819.62
2317360649.43
2317449819.62
什么可能导致结果不一致?
最佳答案
对于浮点运算,数字相加的顺序可以 affect the result .
但在本例中,您使用的是精确的 Decimal(12,2)
。
问题在于,对于 nGroup、nUser、dTransaction
的重复值,ROW_NUMBER
不是确定性的,因此不同的运行可能会返回不同的结果。
要获得确定性行为,您可以将保证唯一的列添加到 ORDER BY
的末尾以充当平局断路器。
关于sql-server - 在 MSSQL 中使用 OVER PARTITION 时 SUM 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18499165/