यह स्टैक ओवरफ़्लो पर अक्सर आने वाली सबसे बड़ी-एन-प्रति-समूह समस्या है।
यह रहा मेरा सामान्य उत्तर:
select
p.name player,
s.date first_score,
s.points points
from players p
join scores s
on s.player_id = p.id
left outer join scores s2
on s2.player_id = p.id
and s2.date < s.date
where
s2.player_id is null
;
दूसरे शब्दों में, दिया गया स्कोर s, उसी खिलाड़ी के लिए स्कोर s2 खोजने का प्रयास करें, लेकिन पहले की तारीख के साथ। अगर पहले का कोई स्कोर नहीं मिलता है, तो s सबसे पहला स्कोर है।
संबंधों के बारे में अपनी टिप्पणी दें:आपके पास एक नीति होनी चाहिए जिसके लिए टाई के मामले में उपयोग किया जा सके। एक संभावना यह है कि यदि आप ऑटो-इंक्रिमेंटिंग प्राथमिक कुंजी का उपयोग करते हैं, तो कम से कम मूल्य वाला पहला वाला होता है। नीचे बाहरी जुड़ाव में अतिरिक्त शब्द देखें:
select
p.name player,
s.date first_score,
s.points points
from players p
join scores s
on s.player_id = p.id
left outer join scores s2
on s2.player_id = p.id
and (s2.date < s.date or s2.date = s.date and s2.id < s.id)
where
s2.player_id is null
;
मूल रूप से आपको टाईब्रेकर शब्द जोड़ने की जरूरत है जब तक कि आप एक ऐसे कॉलम तक नहीं पहुंच जाते जो अद्वितीय होने की गारंटी है, कम से कम दिए गए खिलाड़ी के लिए। तालिका की प्राथमिक कुंजी अक्सर सबसे अच्छा समाधान होता है, लेकिन मैंने ऐसे मामले देखे हैं जहां एक और कॉलम उपयुक्त था।
मेरे द्वारा @OMG Ponies के साथ साझा की गई टिप्पणियों के संबंध में, याद रखें कि इस प्रकार की क्वेरी सही अनुक्रमणिका से अत्यधिक लाभान्वित होती है।