Das Ziel dieser Abfrage besteht darin, den kumulierten Gewinn/Verlust für einen bestimmten Benutzer im Zeitverlauf zu berechnen. Beim ersten Versuch tritt jedoch aufgrund eines Missverständnisses über die Natur der Fensterfunktionen in PostgreSQL ein Fehler auf.
Die Fehlermeldung „Spalte „sp.payout“ muss in der angezeigt werden „GROUP BY-Klausel oder in einer Aggregatfunktion verwendet werden“ gibt an, dass PostgreSQL erwartet, dass die Spalten sp.payout und s.buyin in der GROUP BY-Klausel enthalten sind, da sie in verwendet werden die angebliche Aggregatfunktion sum(). Dies ist jedoch eine Fehlidentifikation.
In dieser Abfrage wird sum() als Fensterfunktion und nicht als Aggregatfunktion verwendet. Fensterfunktionen aggregieren im Gegensatz zu Aggregatfunktionen Werte innerhalb eines angegebenen Bereichs, behalten jedoch nach der Operation alle einzelnen Zeilen bei. Dies ist ein wesentlicher Unterschied, der durch die falsche Annahme der Abfrage über Aggregatfunktionen übersehen wird.
Die Lösung besteht darin, Fensterfunktionen korrekt zu identifizieren und zu nutzen. PostgreSQL ermöglicht die Kombination von Fenster- und Aggregatfunktionen, wobei Aggregatfunktionen zuerst angewendet werden.
Die überarbeitete Abfrage berücksichtigt dieses Verständnis:
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;
Die äußere sum() in diesem Ausdruck (sum(sum(sp.payout)) OVER w) ist eine Fensterfunktion, während die innere sum() ist eine Aggregatfunktion. Die Aggregatfunktion summiert die Auszahlungs- und Buyin-Werte innerhalb jedes Ereignisses, und die Fensterfunktion summiert dann diese Gesamtergebnisse über den angegebenen Bereich.
Das obige ist der detaillierte Inhalt vonWarum generiert meine PostgreSQL-Abfrage bei der Verwendung von Fensterfunktionen den Fehler „Spalte „sp.payout' muss in der GROUP BY-Klausel erscheinen'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!