You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用DuckDB Python关系型API实现带FILTER子句的SUM聚合查询

如何用DuckDB Python关系型API实现带FILTER子句的SUM聚合查询

嘿,我明白你遇到的问题了——你想用DuckDB的Python关系型API实现带FILTER子句的SUM聚合,但之前的写法把FILTER当成了一个独立函数调用,这其实是对API用法的误解。

在DuckDB的SQL语法里,FILTER (WHERE ...)是聚合函数的附属子句,而不是一个单独的函数。对应到Python关系型API中,你需要先创建聚合表达式(比如SUM),然后在这个表达式上调用.filter()方法来指定过滤条件,而不是把filter嵌套成FunctionExpression。

正确的写法

这里有两种等价的写法,你可以任选一种:

方法1:使用简洁的duckdb.fn和duckdb.col语法(推荐)

rel.select(duckdb.fn.sum('a').filter(duckdb.col('b') > 1))

方法2:使用完整的表达式类写法

rel.select(
    duckdb.FunctionExpression('sum', duckdb.ColumnExpression('a'))
    .filter(duckdb.ColumnExpression('b') > 1)
)

验证结果

运行上面的代码后,你会得到和SQL查询完全一致的结果:

┌───────────────────────────────┐
│ sum(a) FILTER (WHERE (b > 1)) │
│            int128             │
├───────────────────────────────┤
│                             6 │
└───────────────────────────────┘

为什么之前的写法出错?

你之前尝试的duckdb.FunctionExpression('filter', ...)是在调用DuckDB的数组过滤函数(filter(ANY[], LAMBDA)),这和聚合函数的FILTER子句完全是两个东西,所以才会抛出“找不到匹配函数”的BinderException。

备注:内容来源于stack exchange,提问作者ignoring_gravity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:28:06