আপনার বর্তমান ক্যোয়ারী পছন্দসই ফলাফল দিচ্ছে না কারণ আপনি কলামে এমন একটি GROUP BY
ধারা ব্যবহার করছেন PERSON_ID
যা উভয় প্রবেশের জন্য একটি অনন্য মূল্য। ফলস্বরূপ আপনি উভয় সারি ফিরে আসবেন।
কয়েকটি উপায় রয়েছে যা আপনি এটি সমাধান করতে পারেন। আপনি max(LAST_UPDATE_DATE_TIME)
প্রতিটি জন্য ফেরত যোগাড়ী ফাংশন প্রয়োগ করতে একটি subquery ব্যবহার করতে পারেন 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;
ডেমো সহ এসকিউএল ফিডল দেখুন
অথবা আপনি প্রতিটি বিদ্যালয়ের সর্বাধিক সাম্প্রতিককালের সাথে ডেটার সারিগুলি ফিরিয়ে আনতে উইন্ডোটিং ফাংশনটি ব্যবহার করতে পারেন 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;
ডেমো সহ এসকিউএল ফিডল দেখুন
এই কোয়েরিটি প্রয়োগ করে row_number()
যা পার্টিশনের প্রতিটি সারিতে একটি স্বতন্ত্র সংখ্যা নির্ধারণ SCHOOL_CODE
করে এবং এর উপর ভিত্তি করে একটি অবতরণ ক্রমে স্থাপন করে LAST_UPDATE_DATE_TIME
।
পার্শ্ব নোট হিসাবে, সামগ্রিক ক্রিয়াকলাপের সাথে যুক্ত হওয়া row_number()
সংস্করণটির সাথে ঠিক একই নয় । আপনার যদি একই ইভেন্টের সময় সহ দুটি সারি থাকে তবে JOIN উভয় সারি ফিরিয়ে দেবে, যখন row_number()
কেবলমাত্র একটিটি ফিরে আসবে । যদি আপনি উভয় উইন্ডোটিং ফাংশন দিয়ে ফিরতে চান rank()
তবে তার পরিবর্তে উইন্ডোটিং ফাংশনটি ব্যবহার করার কথা বিবেচনা করুন কারণ এটি বন্ধনগুলি ফিরিয়ে দেবে:
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;
ডেমো দেখুন