Votre requête actuelle ne donne pas le résultat souhaité car vous utilisez une GROUP BY
clause sur la PERSON_ID
colonne qui a une valeur unique pour les deux entrées. Par conséquent, vous retournerez les deux lignes.
Il existe plusieurs façons de résoudre ce problème. Vous pouvez utiliser une sous-requête pour appliquer la fonction d'agrégation pour renvoyer le max(LAST_UPDATE_DATE_TIME)
pour chacun SCHOOL_CODE
:
select s1.LAST_UPDATE_DATE_TIME,
s1.SCHOOL_CODE,
s1.PERSON_ID
from SCHOOL_STAFF s1
inner join
(
select max(LAST_UPDATE_DATE_TIME) LAST_UPDATE_DATE_TIME,
SCHOOL_CODE
from SCHOOL_STAFF
group by SCHOOL_CODE
) s2
on s1.SCHOOL_CODE = s2.SCHOOL_CODE
and s1.LAST_UPDATE_DATE_TIME = s2.LAST_UPDATE_DATE_TIME;
Voir SQL Fiddle avec démo
Ou vous pouvez utiliser une fonction de fenêtrage pour renvoyer les lignes de données pour chaque école avec la plus récente LAST_UPDATE_DATE_TIME
:
select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME
from
(
select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME,
row_number() over(partition by SCHOOL_CODE
order by LAST_UPDATE_DATE_TIME desc) seq
from SCHOOL_STAFF
where STAFF_TYPE_NAME='Principal'
) d
where seq = 1;
Voir SQL Fiddle avec démo
Cette requête implémente row_number()
qui attribue un numéro unique à chaque ligne de la partition de SCHOOL_CODE
et placé dans un ordre décroissant basé sur le LAST_UPDATE_DATE_TIME
.
En remarque, la fonction JOIN avec agrégat n'est pas exactement la même que la row_number()
version. Si vous avez deux lignes avec le même temps d'événement, JOIN renvoie les deux lignes, tandis que row_number()
n'en renvoie qu'une. Si vous souhaitez renvoyer les deux avec une fonction de fenêtrage, envisagez d'utiliser la rank()
fonction de fenêtrage à la place car elle renverra des liens:
select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME
from
(
select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME,
rank() over(partition by SCHOOL_CODE
order by LAST_UPDATE_DATE_TIME desc) seq
from SCHOOL_STAFF
where STAFF_TYPE_NAME='Principal'
) d
where seq = 1;
Voir la démo