在静态表上,我正在尝试在SSMS中运行以下查询(以获取每个用户的最新事务并将美元值相加):
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
可能导致结果不一致的原因是什么?
答案 0 :(得分:5)
对于浮点运算,添加数字的顺序可以是affect the result。
但在这种情况下,您使用的是Decimal(12,2)
,这是精确的。
问题是nGroup, nUser, dTransaction
的重复值ROW_NUMBER
不确定,因此不同的运行会返回不同的结果。
要获得确定性行为,您可以在ORDER BY
的末尾添加有保证的唯一列,以充当平局。