Permintaan Anda saat ini tidak memberikan hasil yang diinginkan karena Anda menggunakan GROUP BYklausa pada PERSON_IDkolom yang memiliki nilai unik untuk kedua entri. Akibatnya, Anda akan mengembalikan kedua baris.
Ada beberapa cara untuk menyelesaikannya. Anda dapat menggunakan subquery untuk menerapkan fungsi agregat untuk mengembalikan max(LAST_UPDATE_DATE_TIME)masing-masing 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;
Lihat SQL Fiddle dengan Demo
Atau Anda dapat menggunakan fungsi windowing untuk mengembalikan baris data untuk setiap sekolah dengan yang terbaru 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;
Lihat SQL Fiddle dengan Demo
Query ini mengimplementasikan row_number()yang memberikan nomor unik untuk setiap baris dalam partisi SCHOOL_CODEdan ditempatkan dalam urutan menurun berdasarkan LAST_UPDATE_DATE_TIME.
Sebagai catatan, GABUNG dengan fungsi agregat tidak persis sama dengan row_number()versi. Jika Anda memiliki dua baris dengan waktu acara yang sama, GABUNG akan mengembalikan kedua baris, sedangkan row_number()hanya akan mengembalikan satu baris . Jika Anda ingin mengembalikan keduanya dengan fungsi windowing, maka pertimbangkan menggunakan rank()fungsi windowing karena akan mengembalikan ikatan:
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;
Lihat Demo