[RESOLU] LAG si NULL récursif
Citation:
Envoyé par
SQLpro
C'est normal que vous ayez un NULL, puisque LAG considère la ligne d'avant...
Pour faire cela utilisez une sous requête corrélée.
A +
Ce n'est pas aussi normal que vous le dites. En tout cas dans mon esprit. La question théorique sous-jacente était : est-ce que le LAG se base sur la valeur du ROW précédent avant ou après que le LAG du ROW précédent ait été effectué.
En d'autres mots, est-ce que la fonction analytique LAG se base sur une table virtuelle dont les valeurs calculées sont modifiées en séquence ou sur une table fictive dont les valeurs calculées ne sont pas modifiées.
Démonstration avec
Code:
1 2 3 4 5
| SELECT
ID,
Date,
COALESCE( Montant, LAG(Montant) OVER (ORDER BY IDGroupe, Date) ) Montant_C
FROM Historique |
1) Les lignes nécessaires sont collectées dans une table fictive (peut-être uniquement les références d'index pour optimisation)
2) De la présence du LAG, le code de traitement analyse et le champ calculé Montant_C
A) La ligne 1 est analysée
i) Montant n'est pas NULL, ce sera sa valeur qui résultera dans Montant_C
B) La ligne 2 est analysée
i) Montant est NULL, la procédure "parcourt dans un ordre précis" afin de trouver la ligne précédente à l'actuelle dans cet ordre. Ici, la valeur de Montant à la ligne 1.
C) La ligne 3 est analysée
i) Montant est NULL, la procédure "parcourt dans un ordre précis" afin de trouver la ligne précédente à l'actuelle dans cet ordre. Ici, arrive ma question est la valeur Montant_C ou la valeur Montant de la ligne 2 qui sera utilisé. Autrement dit, est-ce la valeur NULL ou 12556 qui sera pris.
Je crois que je réponds à ma question dans ma post-réflexion suivante: "L'ordre de traitement des lignes n'est pas garanti en séquence sur l'ordre logique qu'on attend. Il est dès lors impossible de garantir que la ligne x-1 soit absolument traitée avant la ligne x. Donc, il se peut que la ligne x conserve une valeur NULL tout autant quelle peut avoir une nouvelle valeur calculé. Si l'état n'est pas garanti, il ne peut être fiable et doit être interdit."
Waldar, je crois qu'il y a une mésentente sur le terme IDGroupe - que j'ai mal formulé, bien entendu ;) Cependant, je vais regarder à votre solution pour en extraire l'essence. Cela pourrait me fournir une méthode de pensée inédite dans mon univers :)
Par ailleurs, jouant avec des trimestres, j'ai finalement opté pour une suite de 4 LAG en cherchant le premier des 4 montants précédents qui ne soit pas NULL. Il est garanti qu'un trimestre ait un montant. Or, je garde votre réponse sous le bras, si ça peut me permettre de faire gagner quelques précieuses secondes à mon directeur.
En tout cas merci à vous deux pour avoir fait attention à mon post et d'avoir pris du temps à me répondre.