Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

मैं अपने डीबी में उपयोगकर्ताओं के लिए रैंकिंग कैसे पूछ सकता हूं, लेकिन केवल प्रत्येक उपयोगकर्ता के लिए नवीनतम प्रविष्टि पर विचार कर सकता हूं?

इसे मैं "महानतम-एन-प्रति-समूह" समस्या कहता हूं। यह प्रति सप्ताह कई बार 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 के किसी भी फ्लेवर में काम करता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टी-एसक्यूएल क्वेरी की आवश्यकता है सभी संभावित तरीके खोजें

  2. SQL सर्वर में एक स्कीमा बाउंड व्यू बनाएं

  3. Salesforce SOQL के साथ SQL सर्वर का उपयोग करने के लिए युक्तियाँ

  4. एक स्क्रिप्ट से SQL क्वेरी की तुलना में संग्रहीत कार्यविधियाँ निष्पादित क्यों तेज़ हैं?

  5. SSIS 2005 में BufferTempStoragePath के लिए डिफ़ॉल्ट फ़ाइल पथ स्थान क्या है?