मैं देखता हूं कि बहुत से लोग ऐसा करने के लिए उपश्रेणी या अन्य विक्रेता-विशिष्ट सुविधाओं का उपयोग करते हैं, लेकिन मैं अक्सर इस तरह की क्वेरी बिना उपश्रेणी के निम्नलिखित तरीके से करता हूं। यह सादे, मानक 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
सबसे बड़ी पंक्ति थी ।date
userid
उन मामलों में (जब कोई मिलान नहीं होता है), के कॉलम t2
होंगे NULL
- यहां तक कि जुड़ने की स्थिति में निर्दिष्ट कॉलम भी। इसलिए हम इसका उपयोग करते हैं WHERE t2.UserId IS NULL
, क्योंकि हम उन मामलों की खोज कर रहे हैं जहां कोई पंक्ति date
दी गई के लिए अधिक नहीं मिली userid
।