संपादित प्रश्न का उत्तर देना (अर्थात संबद्ध कॉलम भी प्राप्त करने के लिए)।
Sql सर्वर 2005+ में, सबसे अच्छा तरीका यह होगा कि एक रैंकिंग/विंडो का उपयोग किया जाए। समारोह एक CTE के संयोजन में , इस तरह:
with exam_data as
(
select r.student_id, r.score, r.date,
row_number() over(partition by r.student_id order by r.score desc) as rn
from exam_results r
)
select s.name, d.score, d.date, d.student_id
from students s
join exam_data d
on s.id = d.student_id
where d.rn = 1;
एएनएसआई-एसक्यूएल अनुपालन समाधान के लिए, एक सबक्वेरी और सेल्फ-जॉइन इस तरह काम करेगा:
select s.name, r.student_id, r.score, r.date
from (
select r.student_id, max(r.score) as max_score
from exam_results r
group by r.student_id
) d
join exam_results r
on r.student_id = d.student_id
and r.score = d.max_score
join students s
on s.id = r.student_id;
यह अंतिम मानता है कि छात्र_आईडी/मैक्स_स्कोर संयोजन डुप्लिकेट नहीं हैं, यदि वहां हैं और/या आप उन्हें डी-डुप्लिकेट करने की योजना बनाना चाहते हैं, तो आपको यह तय करने के लिए कि कौन सा रिकॉर्ड खींचना है, आपको कुछ निर्धारित करने के लिए एक और सबक्वायरी का उपयोग करने की आवश्यकता होगी . उदाहरण के लिए, यह मानते हुए कि आपके पास एक ही तिथि वाले किसी दिए गए छात्र के लिए एकाधिक रिकॉर्ड नहीं हो सकते हैं, यदि आप नवीनतम max_score के आधार पर एक टाई तोड़ना चाहते हैं, तो आप निम्न की तरह कुछ करेंगे:
select s.name, r3.student_id, r3.score, r3.date, r3.other_column_a, ...
from (
select r2.student_id, r2.score as max_score, max(r2.date) as max_score_max_date
from (
select r1.student_id, max(r1.score) as max_score
from exam_results r1
group by r1.student_id
) d
join exam_results r2
on r2.student_id = d.student_id
and r2.score = d.max_score
group by r2.student_id, r2.score
) r
join exam_results r3
on r3.student_id = r.student_id
and r3.score = r.max_score
and r3.date = r.max_score_max_date
join students s
on s.id = r3.student_id;
संपादित करें:टिप्पणियों में मार्क की अच्छी पकड़ के लिए उचित डी-डुप्लिकेटिंग क्वेरी जोड़ा गया