Truy vấn hiện tại của bạn không cho kết quả mong muốn vì bạn đang sử dụng GROUP BY
mệnh đề trên PERSON_ID
cột có giá trị duy nhất cho cả hai mục nhập. Kết quả là bạn sẽ trả lại cả hai hàng.
Có một vài cách mà bạn có thể giải quyết điều này. Bạn có thể sử dụng truy vấn con để áp dụng hàm tổng hợp để trả về max(LAST_UPDATE_DATE_TIME)
cho mỗi 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;
Xem SQL Fiddle với bản demo
Hoặc bạn có thể sử dụng chức năng cửa sổ để trả về các hàng dữ liệu cho từng trường gần đây nhất 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;
Xem SQL Fiddle với bản demo
Truy vấn này thực hiện việc row_number()
gán một số duy nhất cho mỗi hàng trong phân vùng SCHOOL_CODE
và được đặt theo thứ tự giảm dần dựa trên LAST_UPDATE_DATE_TIME
.
Là một lưu ý phụ, THAM GIA với chức năng tổng hợp không hoàn toàn giống với row_number()
phiên bản. Nếu bạn có hai hàng có cùng thời gian sự kiện, THAM GIA sẽ trả về cả hai hàng, trong khi đó hàng row_number()
sẽ chỉ trả về một hàng. Nếu bạn muốn trả về cả hai với chức năng cửa sổ, thì hãy xem xét sử dụng rank()
chức năng cửa sổ thay vì nó sẽ trả về các mối quan hệ:
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;
Xem bản demo