在MSSQL中使用OVER PARTITION时不一致的SUM

时间:2013-08-28 22:14:40

标签: sql-server sql-server-2008

在静态表上,我正在尝试在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

可能导致结果不一致的原因是什么?

1 个答案:

答案 0 :(得分:5)

对于浮点运算,添加数字的顺序可以是affect the result

但在这种情况下,您使用的是Decimal(12,2),这是精确的。

问题是nGroup, nUser, dTransaction的重复值ROW_NUMBER不确定,因此不同的运行会返回不同的结果。

要获得确定性行为,您可以在ORDER BY的末尾添加有保证的唯一列,以充当平局。