2017-11-21 3 views
2

Wie filtere ich alle Gruppen mit Gesamtsummen von 0?SQLAlchemy: Wie nach der Aggregation gefiltert wird

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

Dies führt den Fehler in Zeile 3:

... sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) misuse of aggregate: sum() ...

Eine Abhilfe ist, die Filter zu entfernen und zu tun:

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

Aber das ist sehr langsam im Vergleich zu einer SQL-Abfrage Filterung .

(hrsg. Zu vereinfachen) ist

+0

Etwas verwandten: https://stackoverflow.com/questions/648083/sql-error-misuse-of-aggregate –

Antwort

2

Okay, die Antwort having() zu verwenden. Siehe 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() 

Schön, einfach und schnell.

Das Schreiben der Frage half mir, klarer zu denken und half mir, die Antwort in der Dokumentation zu finden. Ich lasse das hier für den Fall, dass es jemandem hilft. (. EDITED revised Frage zu reflektieren)

Verwandte Themen