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 classiqueOVER (ORDER BY dt)
: applique cette somme progressivement selon la datedt
- 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
.