Heim > Datenbank > MySQL-Tutorial > Warum generiert meine PostgreSQL-Abfrage bei der Verwendung von Fensterfunktionen den Fehler „Spalte „sp.payout' muss in der GROUP BY-Klausel erscheinen'?

Warum generiert meine PostgreSQL-Abfrage bei der Verwendung von Fensterfunktionen den Fehler „Spalte „sp.payout' muss in der GROUP BY-Klausel erscheinen'?

Mary-Kate Olsen
Freigeben: 2025-01-06 11:19:46
Original
950 Leute haben es durchsucht

Why Does My PostgreSQL Query Generate a

Fensterfunktion und Group By-Ausnahme in PostgreSQL

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.

Falsch identifizierte Aggregatfunktionen

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.

Verwendung von Fensterfunktionen

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.

Fenster- und Aggregatfunktionen kombinieren

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.

Überarbeitete Abfrage

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;
Nach dem Login kopieren

Erklärung

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.

Wichtige Punkte

  • Fensterfunktionen aggregieren Werte über a angegebener Bereich, wobei alle Zeilen nach der Operation beibehalten werden.
  • Aggregatfunktionen werden zuerst angewendet, wenn Fenster- und Aggregatfunktionen kombiniert werden.
  • Verwenden Der richtige Funktionstyp (Fenster oder Aggregat) ist entscheidend für die ordnungsgemäße Ausführung der Abfrage.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage