Bonjour, j'essaie de réaliser depuis tout a l'heure un requete SQL qui me semblait simple, mais je m'arrache les cheveux sur oracle.

J'ai une table, appelée RANK. Grosso modo

Code x : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
EMP_ID Number,
RANK_ID Number primary key,
RANK_START timestamp,
RANK_END timestamp
X,Y,Z données diverses que je cheche à extraire.

J'ai besoin de faire la requete suivante:retourner un tableau, groupé par employé, et dont les colonnes sont les valeurs les plus "récentes" au sens de la paire [RANK_START, RANK_END] (en fait, les dernière dans l'ordre de tri)

J'arrive à faire du order by suivant mon critère, j'arrive à mettre mes closes WHERE pour filter les lignes dont le range START/END n'inclue pas aujourd'hui, mais je n'arrive par à prendre la "dernière row" pour chaque EMP_ID.

D'après ce que je trouve sur le net, en SQL, c'est aussi simple que de faire

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
select EMP_ID, last(RANK_ID), last(X), last(Y), last(Z) 
from RANK 
order by RANK_START DESC ,RANK_END DESC
group by EMP_ID

seulement voilà, oracle butte sur last (invalid identifier) qu'il ne reconnait pas comme fonction d'aggrégation

Donc pour faire simple, j'ai dans ma table
Code x : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
EMP_ID RANK_ID, RANK_START, RANK_END, X , Y , Z
1      1       1/1/2000 1/1/2002 A  A  A
1      2       1/1/2001 1/1/2012 A  B  A
2      3       1/1/2000 1/1/2013 A  B  A
3      4       1/1/2001 1/1/2012 A  B  A
3      5       1/1/1998 1/1/2001 A  B  A

et je veux obtenir

Code x : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
EMP_ID RANK_ID, RANK_START, RANK_END, X , Y , Z
1      2       1/1/2001 1/1/2012 A  B  A
2      3       1/1/2000 1/1/2013 A  B  A
3      4       1/1/2001 1/1/2012 A  B  A

Si quelqu'un peut m'aider. A noter que la requete rentrera en tant que sous requete comme partie droite dans une left outer join, le but final étant d'aplatire les tables Employé et rank pour avoir un tableau avec les données de l'employe et le "rank actuel". Donc si quelqu'un a une solution qui fait l'applatissement directement, c'est bon aussi. Pour le moment je part sur ce format

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
from (<sous requete liant deux/trois tables pour former l employé>) e left outer join (<sous requete que j essaie ici de construire>) r on e.emp_id=r.emp_id