Accueil – Le CFO masqué › Forums › Power Query › performance des fonctions récursives
- Ce sujet contient 0 réponse, 1 participant et a été mis à jour pour la dernière fois par alexis.bourdeau, le il y a 5 années et 1 mois.
-
AuteurArticles
-
15 août 2019 à 4 h 56 min #57154alexis.bourdeauParticipant
Bonjour
Je suis nouveau ici et sur les techno Microsoft !
J’ai besoin de quelques conseils sur les fonctions récursives Power Query.
je dois faire l’action suivante :
J’ai une table de 300 000 lignes depuis une source SQL.
Je la requète et ajoute une colonne d’index.Ensuite,
je dois mettre à jour la colonne QTY_NEEDED, ligne après ligne,
selon la valeur NUM_OF de la ligne précédente et aussi selon une variable de boucle calculé chaque tour (= quantitySoFar).
– je met à jour la ligne seulement si la valeur NUM_OF de la ligne précédente est égal à NUM_OF de la ligne en cours
– la nouvelle valeur deQTY_NEEDED est 0 si quantitySoFar est plus grand que QTY_TOSERVE sinon c’est QTY_TOSERVE – quantitySoFar
– quantitySoFar est mis à jour aussi dans chaque tour de récursion, si la valeur précédente de NUM_OF est différente de la valeur NUM_OF en cours, c’est (QTY_STOCK – QTY_TOSERVE), sinon c’est (quantitySoFar – QTY_TOSERVE)je l’ai codé et ça marche
sauf que c’est très lent à s’exécuter sur toute la table. Ce n’est pas fini après 1h (j’ai arrété le calcul, je ne sais pas si ça finit)avez vous des idées pour améliorer le code ?
(moins de colonne dans la requete SQL ? utiliser autre chose que “ReplaceValue” ? buffer si possible ?Merci !
let
Source = dsBigSQL_OLEDB_DEV,
DynSQL = Value.NativeQuery (Source,”
SELECT
…
NUM_OF,
QTY_NEEDED,
QTY_TOSERVE,
QTY_STOCK,
DATE,
…
15 columns
FROM
…
WHERE
…
ORDER BY NUM_OF, DATE“),
#”AddedIndex” = Table.AddIndexColumn(DynSQL, “Index”, 1, 1),updateTableLineByLine = (numRow, TableSoFar, quantitySoFar) as table =>
let
// table size
rowcount = Table.RowCount(TableSoFar),
// get from the previous row and the current row : NUM_OF, QTY_NEEDED
previousRow = Table.SelectRows( TableSoFar, each [Index] = numRow-1 ),
currentRow = Table.SelectRows( TableSoFar, each [Index] = numRow ),previousNumOF = previousRow[NUM_OF]{0},
currentQuantityNeeded = currentRow[QTY_NEEDED]{0},
currentQuantityToServe = currentRow[QTY_TOSERVE]{0},
// Compute the new value of QTY_NEEDED and local variable quantitySoFar here
quantitySoFar = quantitySoFar – currentQuantityToServe
newQuantityNeeded = if … then … else …// Update the column QTY_NEEDED ONLY for the current row (=> column Index = numRow) and only if NUM_OF of previous equal NUM_OF of current row
TableWithNewValue = Table.ReplaceValue(TableSoFar,
each Record.Field(_,”QTY_NEEDED”),
each if Record.Field(_,”Index”) = numRow && Record.Field(_,”NUM_OF”) = previousNumOF then newQuantityNeeded else Record.Field(_,”QTY_NEEDED”) ,
Replacer.ReplaceValue,
{“QTY_NEEDED”}
),TableRecursive = if numRow +1 > rowCount then TableWithNewValue else @updateTableLineByLine(numRow +1, TableWithNewValue, quantitySoFar)
in
TableRecursive ,result = updateTableLineByLine(2, AddedIndex, 0)
in
result -
AuteurArticles
- Vous devez être connecté pour répondre à ce sujet.