Ваш поточний запит не дає бажаного результату, оскільки ви використовуєте GROUP BY
пункт про PERSON_ID
стовпчик, який має унікальне значення для обох записів. В результаті ви повернете обидва ряди.
Є кілька способів вирішити це. Ви можете використовувати підзапит, щоб застосувати функцію сукупності для повернення max(LAST_UPDATE_DATE_TIME)
для кожного 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;
Див. SQL Fiddle with Demo
Або ви можете використовувати функцію вікон, щоб повернути рядки даних для кожної школи з останніми 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;
Див. SQL Fiddle with Demo
Цей запит реалізує, row_number()
який присвоює унікальний номер кожному рядку в розділі SCHOOL_CODE
та розміщується у низхідному порядку на основі LAST_UPDATE_DATE_TIME
.
Як бічне зауваження, JOIN з агрегатною функцією не точно збігається з row_number()
версією. Якщо у вас є два ряди з однаковим часом події, ПРИЄДНУЙСЯ поверне обидва ряди, тоді як row_number()
лише один повернеться. Якщо ви хочете повернути обидва за допомогою функції вікна, тоді rank()
замість цього скористайтеся функцією вікна, оскільки вона поверне зв'язки:
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;
Див. Демо