Aller au contenu

Effectuer des sommes cummulées

Les sommes cummulées sont un besoin. Il n'existe pas de fonction CUMSUM sous Postgres, toutefois

🎯 Objectif#

Cumuler les montants ligne par ligne, en respectant un ordre chronologique.

Pour effectuer une somme cummulée, on fait appel au fenêtrage. PostgreSQL propose une syntaxe très puissante appelée fenêtrage (window functions) pour ce type de calcul.

SELECT 
  dt, 
  amount, 
  SUM(amount) OVER (ORDER BY dt) AS cumulative_amount
FROM public.rpt_daily_kpi
ORDER BY dt;
Ouput
| dt         | amount | cumulative_amount |
|------------|--------|-------------------|
| 2022-01-01 | 100    | 100               |
| 2022-01-02 | 50     | 150               |
| 2022-01-03 | 200    | 350               |

📚 Explication#

  • SUM(amount) : somme classique
  • OVER (ORDER BY dt) : applique cette somme progressivement selon la date dt
  • C’est ça, la magie du fenêtrage 🪄

🛠️ Astuce : somme cumulée par groupe#

Vous pouvez aussi partitionner les calculs, par exemple par client :

SELECT 
  customer_id,
  dt,
  amount,
  SUM(amount) OVER (PARTITION BY customer_id ORDER BY dt) AS cumulative_amount
FROM public.rpt_daily_kpi;
select 
    *,
    sum(pct_sales_amount) over (order by sales_amount desc) cum_pct_sales_amount
from (
      select customer_id, sales_amount, sales_amount / sum(sales_amount) over () pct_sales_amount
      from public.sales_day
  ) foo
order by pct_sales_amount desc

.

Partagez sur les réseaux sociaux

Commentaires