मैं देखता हूं कि बहुत से लोग ऐसा करने के लिए सबक्वायरी या अन्य विंडो फ़ंक्शंस का उपयोग करते हैं, लेकिन मैं अक्सर इस तरह की क्वेरी को बिना सबक्वायरी के निम्न तरीके से करता हूं। यह सादे, मानक 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
. के साथ कोई अन्य पंक्ति मौजूद नहीं है और एक बड़ी तिथि।
(मैंने पहचानकर्ता "दिनांक" को सीमांकक में रखा है क्योंकि यह एक SQL आरक्षित शब्द है।)
मामले में अगर 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;
@Farhan से दोबारा कमेंट करें:
यहां अधिक विस्तृत विवरण दिया गया है:
एक बाहरी जुड़ाव 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
. के लिए ।