2017-11-21 16 views
2

集計の合計が0のすべてのグループを除外するにはどうすればよいですか?SQLAlchemy:集計後にフィルターをかける方法

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) misuse of aggregate: sum() ...

この問題を回避するには、フィルタを削除して行うことです。

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

しかし、これは、SQLクエリをフィルタに比べて非常に遅いです。

は(簡単にするために編集しました。)

+0

やや関連:https://stackoverflow.com/questions/648083/sql-error-misuse-of-aggregate –

答えて

2

をさて、答えは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() 

ニース、シンプルで高速です。

質問を書くことは、私がそれをより明確に思うのを助け、ドキュメントの回答を見つけるのを助けました。それが誰かを助ける場合に備えて私はこれをここに残しています。

は(改訂質問を反映するように編集。)

関連する問題