2 votes

Créer une somme cumulative en SQL

Je cherche à calculer une somme cumulée d'une colonne en partition par rapport à une autre colonne, en utilisant SnowFlake SQL. Voici un exemple de table d'entrée:

ID_1    DATE_1      FLAG
A      10/12/2016   1
A      10/31/2016   1
A      11/8/2016    1
B      2/1/2017     1
B      3/27/2017    1

Je veux calculer une somme cumulée entre FLAG et DATE_1 (par ordre croissant), en partitionnant par rapport à ID_1. Ainsi, le résultat dans cet exemple devrait être :

ID_1    DATE_1      FLAG_RUNNING_SUM
A      10/12/2016   1
A      10/31/2016   2
A      11/8/2016    3
B      2/1/2017     1
B      3/27/2017    2

J'ai essayé de faire des expressions de table commune récursives (CTE) pour cela (voir ici: https://docs.snowflake.net/manuals/sql-reference/constructs/with.html) mais Snowflake ne supporte pas les fonctions de fenêtrage dans les CTE récursives, comme indiqué dans ce document.

Est-ce que quelqu'un sait comment je peux faire cela, de préférence proprement?

Je soupçonne que les jointures/CTE récursives sont en quelque sorte la réponse, mais je suis ouvert à des solutions non récursives également. Peu importe ce qui fonctionne.

1voto

Gordon Linoff Points 213350

Il suffit d'utiliser une fonction de fenêtrage :

Sélectionnez t.*,
       sum(flag) over (partition by id_1 order by date_1) as FLAG_RUNNING_SUM
de t;

0voto

MKP Points 106

Vous pouvez également utiliser la requête ci-dessous dans snowflake :

select t.*,
        rank()  over (partition by id_1 order by date_1) as FLAG_RUNNING_SUM
from t

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X