इसे मैं "महानतम-एन-प्रति-समूह" समस्या कहता हूं। यह प्रति सप्ताह कई बार StackOverflow पर आता है।
मैं बाहरी जुड़ाव तकनीक का उपयोग करके इस प्रकार की समस्या का समाधान करता हूं:
SELECT s1.*, s1.wins / s1.losses AS win_loss_ratio
FROM Scrape s1
LEFT OUTER JOIN Scrape s2
ON (s1.username = s2.username AND s1.ScrapeDate < s2.ScrapeDate)
WHERE s2.username IS NULL
ORDER BY win_loss_ratio DESC;
यह प्रत्येक उपयोगकर्ता नाम के लिए केवल एक पंक्ति लौटाएगा -- ScrapeDate
में सबसे अधिक मान वाली पंक्ति कॉलम। कोशिश करने . के लिए बाहरी जुड़ाव यही है s1
. से मेल खाने के लिए किसी अन्य पंक्ति के साथ s2
एक ही उपयोगकर्ता नाम और एक बड़ी तिथि के साथ। यदि ऐसी कोई पंक्ति नहीं है, तो बाहरी जुड़ाव s2
. के सभी स्तंभों के लिए NULL लौटाता है , और फिर हम जानते हैं s1
उस दिए गए उपयोगकर्ता नाम के लिए सबसे बड़ी तिथि वाली पंक्ति से मेल खाती है।
यह तब भी काम करना चाहिए जब आपके पास आंशिक रूप से पूर्ण स्क्रैप प्रगति पर हो।
यह तकनीक जरूरी नहीं है कि सीटीई और रैंकिंग समाधान अन्य उत्तरों के रूप में तेज़ हो। आपको दोनों को आजमाना चाहिए और देखना चाहिए कि आपके लिए क्या बेहतर है। मेरे समाधान को पसंद करने का कारण यह है कि यह SQL के किसी भी फ्लेवर में काम करता है।