Postgres fournit des fonctions de fenêtre pour analyser les données sur différentes partitions. Cependant, les combiner avec des fonctions d'agrégation peut entraîner de la confusion et des erreurs.
Dans la requête donnée, l'utilisateur tente de calculer le profit/la perte cumulé pour un utilisateur au fil du temps, mais rencontre une erreur :
ERROR: column "sp.payout" must appear in the GROUP BY clause or be used in an aggregate function
Cette erreur survient car les fonctions SUM appliquées à sp.payout et s.buyin sont en fait des fonctions de fenêtre en raison de la clause OVER. Les fonctions de fenêtre conservent toutes les lignes tout en agrégeant les valeurs au sein d'une partition.
Pour résoudre ce problème, agrégez d'abord les données, puis utilisez les valeurs agrégées dans les fonctions de fenêtre. Dans ce cas, nous pouvons calculer la somme des paiements et des buy-ins pour chaque événement :
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;
Ici, les fonctions SUM externes agrègent les valeurs de tous les résultats d'un événement, et les fonctions de fenêtre calculent ensuite le profit cumulé. /perte.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!