Maison >base de données >tutoriel mysql >Comment puis-je calculer les sommes cumulées dans PostgreSQL à l'aide des fonctions de fenêtre ?

Comment puis-je calculer les sommes cumulées dans PostgreSQL à l'aide des fonctions de fenêtre ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-12 17:23:45159parcourir

How Can I Calculate Cumulative Sums in PostgreSQL Using Window Functions?

Calculer la somme cumulée à l'aide de la fonction fenêtre dans PostgreSQL

Question :

Vous disposez d'une table intermédiaire qui contient des données financières et des sommes cumulées qui doivent être insérées dans la table cible. La structure de la table intermédiaire contient les colonnes suivantes :

  • ea_month : mois
  • id : identifiant unique
  • amount : montant de la transaction
  • ea_year : Année
  • circle_id : Cercles liés aux transactions

Le tableau cible doit contenir une colonne supplémentaire cum_amt qui reflète la somme cumulée des montants pour chaque ligne.

Solution :

Pour ce faire, vous pouvez utiliser la fonctionnalité de fonctions de fenêtre de PostgreSQL, qui vous permet d'effectuer des calculs sur une plage de lignes. Plus précisément, vous pouvez utiliser la clause OVER pour appliquer une fonction d'agrégation dans une fenêtre définie (SUM dans ce cas) :

<code class="language-sql">SELECT ea_month, id, amount, ea_year, circle_id,
       sum(amount) OVER (PARTITION BY circle_id ORDER BY ea_year, ea_month) AS cum_amt
FROM   tbl
ORDER  BY circle_id, ea_year, ea_month;</code>

Dans cette requête :

  • PARTITION BY circle_id : Divisez les données en groupes basés sur circle_id, en vous assurant que la somme cumulée est calculée séparément pour chaque cercle.
  • ORDER BY ea_year, ea_month : Spécifie l'ordre de tri au sein de chaque partition, garantissant que la somme cumulée est calculée par ordre chronologique.
  • cum_amt : L'expression agrégationSUM calcule la somme cumulée de chaque ligne, en considérant toutes les lignes depuis le début de la partition jusqu'à la ligne actuelle.

REMARQUE : Assurez-vous que vos paires de tables (circle_id, ea_year, ea_month) ont des index uniques pour garantir un regroupement correct des calculs. Cela garantit que les lignes avec les mêmes circle_id, ea_year et ea_month apparaissent toujours ensemble dans un ordre trié.

En utilisant la technique des fonctions de fenêtre, vous pouvez calculer efficacement la somme cumulée de chaque ligne et l'insérer dans la table cible.

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!

Déclaration:
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