Her iki giriş için benzersiz bir değere sahip GROUP BYolan PERSON_IDsütunda bir cümle kullandığınızdan, geçerli sorgunuz istenen sonucu vermiyor. Sonuç olarak her iki satırı da döndürürsünüz.
Bunu çözmenin birkaç yolu vardır. max(LAST_UPDATE_DATE_TIME)Her biri için dönmek üzere toplama işlevini uygulamak üzere bir alt sorgu kullanabilirsiniz 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;
Demo ile SQL Fiddle'ı görün
Veya her okul için en yeni veri satırlarını döndürmek üzere bir pencereleme işlevi kullanabilirsiniz 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;
Demo ile SQL Fiddle'ı görün
Bu sorgu row_number(), bölümünde her satıra benzersiz bir sayı atayan SCHOOL_CODEve LAST_UPDATE_DATE_TIME.
Bir yan not olarak, toplama işlevli JOIN, row_number()sürümle tam olarak aynı değildir . Aynı olay süresine sahip iki satırınız varsa, JOIN her iki satırı da döndürür row_number(), yalnızca bir satır döndürür. Her ikisini de bir pencereleme işleviyle döndürmek istiyorsanız, rank()bağları döndüreceği için pencereleme işlevini kullanmayı düşünün :
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;
Demoya Bakın