Permintaan Anda saat ini tidak memberikan hasil yang diinginkan karena Anda menggunakan GROUP BY
klausa pada PERSON_ID
kolom 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_CODE
dan 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