Heim > Datenbank > MySQL-Tutorial > Wie verwende ich Fensterfunktionen mit GROUP BY in Postgres korrekt, um kumulative Benutzerstatistiken zu berechnen?

Wie verwende ich Fensterfunktionen mit GROUP BY in Postgres korrekt, um kumulative Benutzerstatistiken zu berechnen?

Linda Hamilton
Freigeben: 2025-01-06 11:12:40
Original
914 Leute haben es durchsucht

How to Correctly Use Window Functions with GROUP BY in Postgres to Calculate Cumulative User Statistics?

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

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

  • Um mehrere Spieler einzubeziehen, ersetzen Sie die WHERE-Klausel durch : WHERE p.player_id < 17.
  • Wenn p.name nicht eindeutig ist, gruppieren und sortieren Sie zusätzlich nach Spieler-ID, um korrekte Ergebnisse zu erzielen.
  • Gruppierung nach E-Datum und p.name kann zu Leistungsvorteilen führen.

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!

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