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

Jus*_*ark 2 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
Run Code Online (Sandbox Code Playgroud)

这是一个包含2,701,510行的表,nMoney列的类型为Decimal(12,2).当我多次运行时,我得到了不同的结果:

2317367341.75
2317370443.45
2317449819.62
2317360649.43
2317449819.62
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ith 5

对于浮点运算,添加数字的顺序会影响结果.

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

问题是,有重复值nGroup, nUser, dTransactionROW_NUMBER不确定性使不同的运行可以返回不同的结果.

为了获得确定性行为,您可以将保证的唯一列添加到结束时ORDER BY作为平局.