Her iki giriş için benzersiz bir değere sahip GROUP BY
olan PERSON_ID
sü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_CODE
ve 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