添加COUNT(DISTINCT ...)为何影响SUM()的计算结果?
问题分析与解答
COUNT(DISTINCT ...)是否影响分组逻辑?
不会。GROUP BY report_date的分组逻辑是固定的,只会依据report_date的值划分数据组,添加COUNT(DISTINCT col2)这类聚合函数不会改变分组规则——同一report_date的行始终会被归为同一组。
SUM结果变化的核心原因
问题出在单精度浮点数(real类型)的加法特性上:
real是单精度浮点类型,本身存在存储精度限制,且浮点数加法不满足结合律。对大量(如每组1700行)浮点数求和时,不同的累加顺序会导致舍入误差的累积程度不同,最终显现为可见的数值差异(你遇到的差值约12)。- 添加
COUNT(DISTINCT col2)后,数据库的执行计划发生了变化:为高效计算去重计数,数据库可能选择了不同的数据读取顺序、排序方式或索引,这直接改变了SUM(col1)的累加顺序,因此产生了固定且可复现的误差差异。 - 你的排查操作也验证了这一点:按
col2排序后复制数据,相当于固定了求和顺序,误差不再变化;切片后数据量减小,误差累积不足以形成可见差异。
解决建议
- 改用更高精度的数值类型:将
col1从real改为double precision(双精度浮点)或numeric(精确数值类型),后者完全不会存在浮点舍入误差问题。 - 若无法修改字段类型,可尝试通过强制排序固定求和顺序(比如在聚合前对每组数据按固定规则排序),但这种方式依赖具体数据库的执行计划控制特性,通用性有限。
内容的提问来源于stack exchange,提问作者Gerhard
相关产品推荐
相关产品推荐

