Bonjour,

j'ai une vue qui me rend des données (en schématisant) de la forme suivante :
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
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       100
 A      3       120
 A      4       120
 B      1       null
 B      2       200
 B      3       200
 B      4       200
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
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
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.
Je n'ai pas trouvé de fonction analytique qui permettrait de ne faire qu'un appel à la 1ère vue....

Merci.