Bonsoir,
je m'essaye aux fonctions analytiques mais je rencontre quelques difficultés.
Pour mes tests j'ai le modèle suivant décrivant différents modèles (ID_MODELE) de véhicules/machines dont plusieurs prototypes (NUM_PROTOTYPE) sont mis à l'essai dans le temps
(à la date DATE_MEC).
Pour chaque modèle, en fonction de la date courante,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 ID_MODELE |NUM_PROTOTYPE | DATE_MEC 1 |1 |16/09/2012 1 |2 |01/01/2012 2 |3 |01/01/2013 2 |4 |01/09/2012 2 |5 |01/08/2012
je voudrais afficher le dernier numéro de prototype mis en circulation et sa date de mise en circulation ainsi
que le prochain à mettre en circulation et sa date de mise en circulation.
Ce qui devrait me donner le résultat suivant :
J'ai donc écrit ma requête ainsi, mais je n'ai pas le résultat escompté :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 id_modele |Numproto_prec |dte_mec_prec |Numproto_next |dte_mec_next ------------------------------------------------------------------------- 1 | 1 |16/09/2012 | | 2 | 4 |01/09/2012 |3 |01/01/2013
Mais je n'arrive pas au résultat voulu. J'ai réussi à écrire la requête en traitant la recherche du prototype passé et du prototype à venir via deux requêtes séparées mais je n'arrive pas à en faire une seule... Un oeil avisé pourrais-t-il me mettre sur la bonne voie ?
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 with T as ( select 1 id_modele, 1 num_prototype, trunc(to_date('16/09/2012','DD/MM/YYYY')) DATE_MEC from dual union select 1 id_modele, 2 num_prototype, trunc(to_date('01/01/2012','DD/MM/YYYY')) DATE_MEC from dual union select 2 id_modele, 3 num_prototype, trunc(to_date('01/01/2013','DD/MM/YYYY')) DATE_MEC from dual union select 2 id_modele, 4 num_prototype, trunc(to_date('01/09/2012','DD/MM/YYYY')) DATE_MEC from dual union select 2 id_modele, 5 num_prototype, trunc(to_date('01/08/2012','DD/MM/YYYY')) DATE_MEC from dual ) SELECT distinct id_modele, case when (date_mec <= TRUNC (SYSDATE)) then last_value(num_prototype ) OVER (PARTITION BY id_modele ORDER BY date_mec asc, num_prototype desc ) else null end AS Numprototype_prec , case when (TRUNC (date_mec) <= TRUNC (SYSDATE)) then last_value(TRUNC(date_mec)) OVER (PARTITION BY id_modele ORDER BY date_mec desc) else null end AS date_mec_prec, case when (TRUNC (date_mec) > TRUNC (SYSDATE)) then first_value(num_prototype ) OVER (PARTITION BY id_modele ORDER BY date_mec asc, num_prototype desc ) else null end AS Numprotonext , case when (TRUNC (date_mec) > TRUNC (SYSDATE)) then first_value(TRUNC(date_mec)) OVER (PARTITION BY id_modele ORDER BY date_mec ) else null end as date_mec_next FROM T;
Merci pour toute aide,
Lek.
Partager