Heim >Datenbank >MySQL-Tutorial >Wie verwende ich Fensterfunktionen mit Aggregatfunktionen in Postgres korrekt, um den kumulierten Gewinn/Verlust zu berechnen?

Wie verwende ich Fensterfunktionen mit Aggregatfunktionen in Postgres korrekt, um den kumulierten Gewinn/Verlust zu berechnen?

DDD
DDDOriginal
2025-01-06 11:07:44714Durchsuche

How to Correctly Use Window Functions with Aggregate Functions in Postgres to Calculate Cumulative Profit/Loss?

Postgres-Fensterfunktionen und Gruppierung nach Ausnahme

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!

Stellungnahme:
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