Su consulta actual no está dando el resultado deseado porque está utilizando una GROUP BY
cláusula en la PERSON_ID
columna que tiene un valor único para ambas entradas. Como resultado, devolverá ambas filas.
Hay algunas maneras en que puede resolver esto. Puede usar una subconsulta para aplicar la función de agregado para devolver el max(LAST_UPDATE_DATE_TIME)
para cada 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;
Ver SQL Fiddle con Demo
O puede usar una función de ventana para devolver las filas de datos para cada escuela con la más reciente 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;
Ver SQL Fiddle con Demo
Esta consulta implementa row_number()
que asigna un número único a cada fila de la partición SCHOOL_CODE
y se coloca en orden descendente en función de LAST_UPDATE_DATE_TIME
.
Como nota al margen, la función UNIR con agregado no es exactamente la misma que la row_number()
versión. Si tiene dos filas con el mismo tiempo de evento, JOIN devolverá ambas filas, mientras row_number()
que solo devolverá una. Si desea devolver ambos con una función de ventanas, considere usar la rank()
función de ventanas en su lugar, ya que devolverá lazos:
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;
Ver demo