如何用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
相关产品推荐
相关产品推荐

