मैं देखता हूं कि बहुत से लोग ऐसा करने के लिए उपश्रेणी या अन्य विक्रेता-विशिष्ट सुविधाओं का उपयोग करते हैं, लेकिन मैं अक्सर इस तरह की क्वेरी बिना उपश्रेणी के निम्नलिखित तरीके से करता हूं। यह सादे, मानक SQL का उपयोग करता है इसलिए इसे RDBMS के किसी भी ब्रांड में काम करना चाहिए।
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON (t1.UserId = t2.UserId AND t1."Date" < t2."Date")
WHERE t2.UserId IS NULL;
दूसरे शब्दों में: उस पंक्ति को लाएँ t1जहाँ से कोई अन्य पंक्ति समान न होUserId और अधिक दिनांक के ।
(मैंने पहचानकर्ता "तिथि" को परिसीमन में डाल दिया क्योंकि यह एक एसक्यूएल आरक्षित शब्द है।)
मामले में अगर t1."Date" = t2."Date", दोहरीकरण प्रकट होता है। आमतौर पर टेबल में auto_inc(seq)चाबी होती है, जैसे id। दोहरीकरण से बचने के लिए निम्न प्रकार इस्तेमाल किया जा सकता है:
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON t1.UserId = t2.UserId AND ((t1."Date" < t2."Date")
OR (t1."Date" = t2."Date" AND t1.id < t2.id))
WHERE t2.UserId IS NULL;
@ फरहान से पुनः टिप्पणी:
यहां अधिक विस्तृत विवरण दिया गया है:
एक बाहरी जुड़ने के t1साथ जुड़ने का प्रयास करता है t2। डिफ़ॉल्ट रूप से, सभी परिणाम t1लौटा दिए जाते हैं, और यदि कोई मैच होता है t2, तो उसे भी लौटा दिया जाता है। यदि t2दी गई पंक्ति के लिए कोई मेल नहीं है t1, तो क्वेरी अभी भी की पंक्ति को लौटाती है t1, और NULLसभी t2स्तंभों के लिए प्लेसहोल्डर के रूप में उपयोग करती है । यह सिर्फ इतना है कि बाहरी जोड़ सामान्य रूप से कैसे काम करते हैं।
इस क्वेरी में ट्रिक यह है कि जॉइन की मैचिंग कंडीशन को ऐसे डिजाइन करें , t2जो एक समान हो userid और एक बड़ा हो date । विचार यह है कि यदि एक पंक्ति में मौजूद है , तो t2अधिक है date, तो उसके t1खिलाफ तुलना में पंक्ति उस के लिए सबसे बड़ी नहीं हो सकती dateहै userid। लेकिन अगर कोई मेल नहीं है - यानी अगर कोई पंक्ति पंक्ति से t2अधिक के साथ मौजूद नहीं dateहै t1- हम जानते हैं कि पंक्ति दी गई के लिए t1सबसे बड़ी पंक्ति थी ।dateuserid
उन मामलों में (जब कोई मिलान नहीं होता है), के कॉलम t2होंगे NULL- यहां तक कि जुड़ने की स्थिति में निर्दिष्ट कॉलम भी। इसलिए हम इसका उपयोग करते हैं WHERE t2.UserId IS NULL, क्योंकि हम उन मामलों की खोज कर रहे हैं जहां कोई पंक्ति dateदी गई के लिए अधिक नहीं मिली userid।