Heim >Datenbank >MySQL-Tutorial >Wie verwende ich Fensterfunktionen mit Aggregatfunktionen in Postgres korrekt, um den kumulierten Gewinn/Verlust zu berechnen?
Postgres bietet Fensterfunktionen zur Analyse von Daten über verschiedene Partitionen hinweg. Die Kombination mit Aggregationsfunktionen kann jedoch zu Verwirrung und Fehlern führen.
In der angegebenen Abfrage versucht der Benutzer, den kumulierten Gewinn/Verlust für einen Benutzer im Zeitverlauf zu berechnen, stößt jedoch auf einen Fehler:
ERROR: column "sp.payout" must appear in the GROUP BY clause or be used in an aggregate function
Dieser Fehler tritt auf, weil die auf sp.payout und s.buyin angewendeten SUM-Funktionen aufgrund der OVER-Klausel tatsächlich Fensterfunktionen sind. Fensterfunktionen behalten alle Zeilen bei, während sie Werte innerhalb einer Partition aggregieren.
Um dieses Problem zu beheben, aggregieren Sie zuerst die Daten und verwenden Sie dann die aggregierten Werte in den Fensterfunktionen. In diesem Fall können wir die Summe der Auszahlungen und Buy-Ins für jedes Event berechnen:
SELECT p.name, e.event_id, e.date, SUM(SUM(sp.payout)) OVER w - SUM(SUM(s.buyin)) OVER w AS "Profit/Loss" FROM player AS p JOIN result AS r ON r.player_id = p.player_id JOIN game AS g ON g.game_id = r.game_id JOIN event AS e ON e.event_id = g.event_id JOIN structure AS s ON s.structure_id = g.structure_id JOIN structure_payout AS sp ON sp.structure_id = g.structure_id AND sp.position = r.position WHERE p.player_id = 17 GROUP BY e.event_id WINDOW w AS (ORDER BY e.date, e.event_id) ORDER BY e.date, e.event_id;
Hier aggregieren die äußeren SUM-Funktionen Werte über alle Ergebnisse innerhalb eines Events und die Fensterfunktionen berechnen dann den kumulierten Gewinn /Verlust.
Das obige ist der detaillierte Inhalt vonWie verwende ich Fensterfunktionen mit Aggregatfunktionen in Postgres korrekt, um den kumulierten Gewinn/Verlust zu berechnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!