Bonjour,
j'ai une vue qui me rend des données (en schématisant) de la forme suivante :
Il faudrait que je crée une 2è vue à partir de celle-ci qui remplacerait pour chaque couple ID/NUM les valeurs nulles par la dernière valeur non nulle dans l'ordre de NUM, soit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ID NUM VALEUR A 1 100 A 2 null A 3 120 A 4 null B 1 null B 2 200 B 3 null B 4 null
j'ai pu le faire de la façon suivante (VUE étant la vue précédente)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ID NUM VALEUR A 1 100 A 2 100 A 3 120 A 4 120 B 1 null B 2 200 B 3 200 B 4 200
L'inconvénient est que la jointure ouverte provoque un HASH JOIN très gourmand qui prend 90% du temps estimé par l'EXPLAIN PLAN.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 select ID, NUM1, NVL(VAL1,VAL2) from ( select v1.ID, v1.NUM NUM1, v2.NUM NUM2, v1.VALEUR VAL1, v2.VALEUR VAL2, max(v2.NUM) over (partition by v1.ID) max_num from VUE V1 left join VUE V2 on v1.ID = v2.ID and V2.NUM <= V1.NUM and V2.VALEUR is not null ) where NUM2=max_num
Je n'ai pas trouvé de fonction analytique qui permettrait de ne faire qu'un appel à la 1ère vue....
Merci.
Partager