如何使用 Python-API 选择列名中包含聚合函数的 duckdb 关系列或为其添加别名?

问题描述 投票:0回答:1

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的)

python sql api alias duckdb
1个回答
0
投票

虽然这可能是当前版本的 DuckDB Python API 的限制,但您可以考虑一些解决方法:

  1. 在 SQL 表达式中使用 AS 子句: 您可以在构建查询时使用 SQL 表达式中的 AS 子句为聚合列添加别名,而不是仅仅依赖 Python API 来设置别名。这样,您就可以直接在 SQL 语句中控制命名:
rel = duckdb.sql('SELECT date, businessunit, sum(pnl) AS pnl_sum FROM tbl')

这将为您提供一个关系,其中聚合列名为“pnl_sum”,然后您可以使用 Python API 引用它:

pnl_sum_column = rel["pnl_sum"]

  1. 使用索引访问列: 如果第一个解决方法不适合您的用例,您可以通过结果关系中的索引访问列。由于“pnl”列是初始 select 语句中的第三列,因此您可以使用索引 2(基于 0 的索引)访问它:
pnl_column = rel[2]

这种方法完全绕过列名,直接通过列在结果关系中的位置来访问列。

© www.soinside.com 2019 - 2024. All rights reserved.