sql-server - 在 MSSQL 中使用 OVER PARTITION 时 SUM 不一致

标签 sql-server sql-server-2008

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

相关文章:

sql - 应该使用哪种数据类型来存储哈希值?

sql - 每列的每个不同值

sql-server - sql仅对连续行进行排名

sql - 如何检查光标是否存在(打开状态)

SQL 2008 加密扫描

c# - 将 UWP App 连接到远程 SQL Server 2008 提供程序 : TCP Provider, 错误:0

sql - 如何从数据库表中选择 4 个大小相等的结果集

c# - 如何在 C# 中以编程方式读取日志文件信息的 sql server mdf header

sql-server - 在 SQL Server 2005 中,有什么方法可以立即更改整个数据库的排序规则吗?

Java、SQL 数据库连接