【问题标题】:SQLAlchemy: How to filter after aggregationSQLAlchemy:聚合后如何过滤
【发布时间】:2017-11-21 17:12:55
【问题描述】:

如何过滤掉总份额为 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()

这会在第 3 行引发错误:

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

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

result = [x for x in g.all() if x[1] != 0.0]

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

(已编辑以简化。)

【问题讨论】:

标签: python sqlalchemy


【解决方案1】:

好的,答案是使用having()。见related。

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

不错,简单,快速。

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

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

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 2019-12-31
    • 2012-07-24
    • 1970-01-01
    • 2018-12-17
    • 2016-07-27
    • 1970-01-01
    • 2019-07-05
    • 2017-05-29
    相关资源
    最近更新 更多