आपकी वर्तमान क्वेरी वांछित परिणाम नहीं दे रही है क्योंकि आप स्तंभ GROUP BY
पर एक खंड का उपयोग कर रहे हैं PERSON_ID
जिसमें दोनों प्रविष्टियों के लिए एक अद्वितीय मूल्य है। परिणामस्वरूप आप दोनों पंक्तियों को वापस कर देंगे।
कुछ तरीके हैं जिनसे आप इसे हल कर सकते हैं। आप max(LAST_UPDATE_DATE_TIME)
प्रत्येक के लिए वापस जाने के लिए कुल फ़ंक्शन को लागू करने के लिए एक सबक्वेरी का उपयोग कर सकते हैं 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;
SQL फिडेल को डेमो के साथ देखें
या आप सबसे हाल के साथ प्रत्येक स्कूल के लिए डेटा की पंक्तियों को वापस करने के लिए एक विंडो फ़ंक्शन का उपयोग कर सकते हैं 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;
SQL फिडेल को डेमो के साथ देखें
यह क्वेरी लागू होती है row_number()
जो विभाजन के प्रत्येक पंक्ति में एक अद्वितीय संख्या निर्दिष्ट करती है SCHOOL_CODE
और उसके आधार पर अवरोही क्रम में रखी जाती है LAST_UPDATE_DATE_TIME
।
एक साइड नोट के रूप में, JOIN इन एग्रीगेट फंक्शन 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;
डेमो देखें