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

उस पंक्ति को प्राप्त करें जिसमें कॉलम के लिए अधिकतम मान है

मैं देखता हूं कि बहुत से लोग ऐसा करने के लिए सबक्वायरी या अन्य विंडो फ़ंक्शंस का उपयोग करते हैं, लेकिन मैं अक्सर इस तरह की क्वेरी को बिना सबक्वायरी के निम्न तरीके से करता हूं। यह सादे, मानक 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 . के लिए ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. AWS EC2 से AWS RDS में Oracle डेटाबेस माइग्रेट करना, भाग 4

  2. Oracle/SQLite में एक स्ट्रिंग से सबस्ट्रिंग कैसे निकालें?

  3. मैं Oracle में एक आरक्षित शब्द से कैसे बचूँ?

  4. Oracle 12c संस्थापन अस्थायी स्थान तक पहुँचने में विफल रहा

  5. Oracle में <> का क्या अर्थ है