Bonjour,
J'ai une table avec chaque ligne qui représente un flux pour la date donnée et je dois obtenir une représentation de stock pour chaque date.
Ca fonctionne bien avec ce jeu de données et ce code :
Par contre ça ne fonctionne plus avec ce jeu de données (lorsqu'une ligne n'est plus présente à une certaine date D, mais qu'il y a un stock antérieur existant, je dois quand même retourner une ligne avec le stock pour la date D) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 drop table if exists columnsFlux; CREATE TABLE columnsFlux ( ViewDate DATE, silo varchar(10), GAR varchar(10), lob varchar(10), recours int ); INSERT INTO columnsFlux VALUES ('2023-01-31', 'EDI', 'GAR1', 'lob1', 10), ('2023-02-28', 'EDI', 'GAR1', 'lob1', 5), ('2023-01-31', 'Completude', 'GAR1', 'lob1', 100), ('2023-02-28', 'Completude', 'GAR1', 'lob1', 50); select i1.ViewDate, i1.silo, i1.GAR, i1.Lob, SUM(coalesce(i2.recours, 0)) as recours FROM columnsFlux i1 JOIN columnsFlux i2 ON i1.Silo = i2.Silo AND i1.GAR = i2.GAR AND i1.Lob = i2.Lob AND i1.ViewDate >= i2.ViewDate GROUP BY i1.Silo, i1.ViewDate, i1.GAR, i1.Lob order by i1.ViewDate, i1.silo, i1.GAR, i1.Lob;
Ici, il manque dans le résultat deux lignes au '2023-03-31' qui doivent reprendre le stock tel qu'il était au '2023-02-28' pour le tuple 'EDI' / 'GAR1' / 'lob1' et pour le tuple 'Completude', 'GAR1', 'lob1', car même s'il n'y a pas eu de nouveau flux au mois de mars, le stock, lui, doit bien ressortir. De la même manière, il manque une ligne au '2023-04-30' pour le stock du tuple 'EDI' / 'GAR1' / 'lob1'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 drop table if exists columnsFlux; CREATE TABLE columnsFlux ( ViewDate DATE, silo varchar(10), GAR varchar(10), lob varchar(10), recours int ); INSERT INTO columnsFlux VALUES ('2023-01-31', 'EDI', 'GAR1', 'lob1', 10), ('2023-02-28', 'EDI', 'GAR1', 'lob1', 5), ('2023-05-31', 'EDI', 'GAR1', 'lob1', 6), ('2023-01-31', 'Completude', 'GAR1', 'lob1', 100), ('2023-02-28', 'Completude', 'GAR1', 'lob1', 50), ('2023-04-30', 'Completude', 'GAR1', 'lob1', 60), ('2023-05-31', 'Completude', 'GAR1', 'lob1', 70); select i1.ViewDate, i1.silo, i1.GAR, i1.Lob, SUM(coalesce(i2.recours, 0)) as recours FROM columnsFlux i1 JOIN columnsFlux i2 ON i1.Silo = i2.Silo AND i1.GAR = i2.GAR AND i1.Lob = i2.Lob AND i1.ViewDate >= i2.ViewDate GROUP BY i1.Silo, i1.ViewDate, i1.GAR, i1.Lob order by i1.ViewDate, i1.silo, i1.GAR, i1.Lob;
Au '2023-05-31', le montant de recours est bien correcte dans le résultat de ma requête. En effet, pour chaque date où il existe un stock du tuple à la date précédente, c'est comme s'il fallait simuler l'ajout d'une ligne avec ce tuple et un flux de valeur 0 pour la colonne recours.
Pour info, je suis sur Databricks avec du spark sql.
Partager