La tua query corrente non sta dando il risultato desiderato perché stai usando una GROUP BY
clausola sulla PERSON_ID
colonna che ha un valore univoco per entrambe le voci. Di conseguenza, verranno restituite entrambe le righe.
Ci sono alcuni modi per risolverlo. È possibile utilizzare una sottoquery per applicare la funzione aggregata per restituire il max(LAST_UPDATE_DATE_TIME)
per ciascuno 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;
Vedi SQL Fiddle with Demo
Oppure puoi usare una funzione di windowing per restituire le file di dati per ogni scuola con le più recenti 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;
Vedi SQL Fiddle with Demo
Questa query implementa row_number()
che assegna un numero univoco a ciascuna riga nella partizione SCHOOL_CODE
e posizionata in un ordine decrescente in base a LAST_UPDATE_DATE_TIME
.
Come nota a margine, la JOIN con funzione aggregata non è esattamente la stessa della row_number()
versione. Se hai due righe con lo stesso tempo dell'evento, JOIN restituirà entrambe le righe, mentre row_number()
ne restituirà solo una. Se si desidera restituire entrambi con una funzione di windowing, prendere in considerazione l'utilizzo della rank()
funzione di windowing in quanto restituirà legami:
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;
Vedi la demo