Maison > base de données > tutoriel mysql > Comment utiliser correctement les fonctions de fenêtre avec les fonctions d'agrégation dans Postgres pour calculer les profits/pertes cumulés ?

Comment utiliser correctement les fonctions de fenêtre avec les fonctions d'agrégation dans Postgres pour calculer les profits/pertes cumulés ?

DDD
Libérer: 2025-01-06 11:07:44
original
698 Les gens l'ont consulté

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

Fonctions de fenêtre Postgres et regrouper par exception

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
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal