Postgres-Fensterfunktion und Gruppierung nach Ausnahme
Problem
Eine Abfrage versucht abzurufen kumulative Benutzerstatistiken im Laufe der Zeit, es treten jedoch Ungenauigkeiten auf. Wenn innerhalb eines Ereignisses mehrere Spiele vorhanden sind, erzeugt die Abfrage mehrere Zeilen für unterschiedliche Auszahlungen. Die offensichtliche Lösung der Gruppierung nach Ereignis-ID schlägt fehl und führt zu dem Fehler: „Spalte „sp.payout“ muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden.“
Lösung
Der Fehler tritt auf, weil die Abfrage anstelle von Aggregatfunktionen Fensterfunktionen verwendet, die Werte pro Partition aggregieren und dabei alle Zeilen beibehalten. Fensterfunktionen erfordern, dass ihre Argumente in der GROUP BY-Klausel enthalten sind.
Um das Problem zu lösen, kann man Fenster- und Aggregatfunktionen wie folgt kombinieren:
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 p JOIN result r ON r.player_id = p.player_id JOIN game g ON g.game_id = r.game_id JOIN event e ON e.event_id = g.event_id JOIN structure s ON s.structure_id = g.structure_id JOIN structure_payout 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;
Erklärung
In dieser Abfrage ist die äußere Funktion sum() eine Fensterfunktion, die die Summe der inneren Funktion sum() berechnet. Die innere Funktion aggregiert die Auszahlungen und Buyins für jeden Spieler innerhalb jedes Events. Das Ergebnis ist eine Zeile pro Spieler und Ereignis, in der der kumulierte Gewinn oder Verlust angezeigt wird.
Zusätzliche Überlegungen
Das obige ist der detaillierte Inhalt vonWie verwende ich Fensterfunktionen mit GROUP BY in Postgres korrekt, um kumulative Benutzerstatistiken zu berechnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!