DuckDB执行SUM查询报错:DECIMAL(7,2)类型转换超出范围
问题解决
错误原因分析
- SQL语法逻辑错误:你的查询里
SELECT 'client'和group by 'client'中的'client'是字符串常量,而非DataFrame里的client列。这不仅会导致分组逻辑完全偏离预期,还会干扰DuckDB的类型推断流程。 - DECIMAL精度溢出:DuckDB默认会把Pandas的浮点列推断为
DECIMAL(7,2)类型,但你的数据中存在102188.25这类整数部分占6位的值,聚合后的总和会更大,远超DECIMAL(7,2)的最大值99999.99,因此触发溢出报错。
解决方案
步骤1:修正SQL分组字段
把查询中的字符串常量'client'改为列名client(去掉单引号),确保按client列正确分组:
df_duckdb = duckdb.sql(""" SELECT client, month, year, SUM(income) AS total_value FROM df GROUP BY client, month, year """).to_df()
步骤2:解决DECIMAL溢出问题
有两种可靠处理方式:
方式一:显式转换为高精度DECIMAL
在聚合时将income转换为更大精度的DECIMAL类型,比如DECIMAL(10,2)(支持最大99999999.99的值,完全覆盖你的数据范围):
df_duckdb = duckdb.sql(""" SELECT client, month, year, SUM(CAST(income AS DECIMAL(10,2))) AS total_value FROM df GROUP BY client, month, year """).to_df()
方式二:修改DuckDB全局配置
如果希望全局调整DECIMAL默认精度,避免每次查询手动转换,可设置decimal_precision参数:
import duckdb # 设置默认DECIMAL精度为10 duckdb.sql("SET decimal_precision = 10;") # 执行查询 df_duckdb = duckdb.sql(""" SELECT client, month, year, SUM(income) AS total_value FROM df GROUP BY client, month, year """).to_df()
为什么Pandas的groupby正常?
Pandas默认用float64类型处理浮点数值,没有DECIMAL类型的精度范围限制,因此不会触发溢出错误。
内容的提问来源于stack exchange,提问作者LukMal
相关产品推荐
相关产品推荐

