SQLAlchemy:如何在聚合后进行过滤

Cha*_*imG 7 python sqlalchemy

如何过滤掉所有总份额为 0 的组?

q = session.query(Trades.ticker, func.sum(Trades.shares))
g = q.group_by(Trades.ticker)
f = g.filter(func.sum(Trades.shares) != 0)
result = f.all()
Run Code Online (Sandbox Code Playgroud)

这会在第 3 行引发错误:

... sqlalchemy.exc.OperationalError:(sqlite3.OperationalError) 滥用聚合:sum() ...

解决方法是删除过滤器并使用列表理解:

result = [x for x in g.all() if x[1] != 0.0]
Run Code Online (Sandbox Code Playgroud)

但与过滤 SQL 查询相比,这非常慢,因为它将所有数据加载到内存中,而不是只加载过滤后的数据。

(编辑以简化。)

Cha*_*imG 6

好的,答案是使用having()。参见相关.

q = session.query(Trades.ticker, func.sum(Trades.shares))
g = q.group_by(Trades.ticker)
f = g.having(func.sum(Trades.shares) != 0)
result = f.all()
Run Code Online (Sandbox Code Playgroud)

很好、简单、快速。

写下问题帮助我更清晰地思考,并帮助我在文档中找到答案。我把它留在这里以防它对某人有帮助。

(已编辑以反映修订后的问题。)