पारंपरिक तरीका एक विश्लेषणात्मक
है। MAX()
(या अन्य विश्लेषणात्मक कार्य):
select *
from ( select s.student_id
, w.last_name
, w.first_name
, s.numeric_grade
, max(s.numeric_grade) over () as numeric_final_grade
from grade s
join section z
on s.section_id = z.section_id
join student w
on s.student_id = w.student_id
where z.course_no = 230
and z.section_id = 100
and s.grade_type_code = 'FI'
)
where numeric_grade = numeric_final_grade
लेकिन मैं शायद FIRST का उपयोग करना पसंद करूंगा। (रखें)।
select max(s.student_id) keep (dense_rank first order by s.numeric_grade desc) as student_id
, max(w.last_name) keep (dense_rank first order by s.numeric_grade desc) as last_name
, max(w.first_name) keep (dense_rank first order by s.numeric_grade desc) as first_na,e
, max(s.numeric_grade_name) as numeric_final_grade
from grade s
join section z
on s.section_id = z.section_id
join student w
on s.student_id = w.student_id
where z.course_no = 230
and z.section_id = 100
and s.grade_type_code = 'FI'
इन दोनों दृष्टिकोणों का लाभ जो आप शुरू में सुझाते हैं, वह यह है कि आप केवल एक बार तालिका को स्कैन करते हैं, दूसरी बार तालिका या अनुक्रमणिका तक पहुंचने की कोई आवश्यकता नहीं है। मैं रॉब वैन विज्क की ब्लॉग पोस्ट की अत्यधिक अनुशंसा कर सकता हूं दोनों के बीच मतभेदों पर।
पी.एस. ये अलग-अलग परिणाम देंगे, इसलिए वे थोड़े अलग हैं। विश्लेषणात्मक फ़ंक्शन डुप्लिकेट बनाए रखेगा, दो छात्रों के पास समान अधिकतम अंक होंगे (यही आपका सुझाव भी करेगा)। एग्रीगेट फ़ंक्शन डुप्लिकेट को हटा देगा, टाई की स्थिति में एक यादृच्छिक रिकॉर्ड लौटाएगा।