DuckDB Python API 允许您通过关系上的链式函数构建复杂的查询。例如,要进行分组依据,可以进行简单的选择,然后在选择关系上使用聚合函数,如下所示:
rel = duckdb.sql('select date, businessunit, pnl from tbl')
rel = rel.aggregate('date, sum(pnl)')
这将创建一个新关系,其中所有 pnl 按日期分组,分组 pnl 的列名称是字符串“sum(pnl)”。
现在我们遇到了一个问题,因为我们无法再使用 Python api 选择名为“sum(pnl)”的列。 DuckDB 无法再区分名为“pnl”的列和名为“sum(pnl)”的列上的“sum”命令。
通过名称引用列会产生错误,因为 DuckDB 认为您想要对列求和。
rel["date"]
可以工作并为您提供日期列,
rel["sum(pnl)"]
错误 BinderException: Binder Error: Referenced column "pnl" not found in FROM clause! Candidate bindings: "query_relation.sum(pnl)"
rel["pnl"]
属性错误,因为该列现在称为“sum(pnl)”而不是“pnl”。
对分组列进行别名可以解决该问题,但 python api 似乎没有提供执行此操作的选项。
引用列名也不起作用,因为 duckdb 现在认为您引用的是字符串而不是列。 ```AttributeError:此关系不包含名称为 '"sum(PnL)"' 的列。
如何使用 Python-api 引用该列或使用 Python-api 为该列别名?
(我可能可以自始至终使用纯sql,但问题是关于Python客户端API的)
虽然这可能是当前版本的 DuckDB Python API 的限制,但您可以考虑一些解决方法:
rel = duckdb.sql('SELECT date, businessunit, sum(pnl) AS pnl_sum FROM tbl')
这将为您提供一个关系,其中聚合列名为“pnl_sum”,然后您可以使用 Python API 引用它:
pnl_sum_column = rel["pnl_sum"]
pnl_column = rel[2]
这种方法完全绕过列名,直接通过列在结果关系中的位置来访问列。