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

SQL केवल कॉलम पर अधिकतम मान वाली पंक्तियों का चयन करता है

पहली नज़र में...

आपको बस एक GROUP BY चाहिए MAX . के साथ क्लॉज कुल कार्य:

SELECT id, MAX(rev)
FROM YourTable
GROUP BY id

यह इतना आसान कभी नहीं होता, है ना?

मैंने अभी देखा है कि आपको content की आवश्यकता है कॉलम भी।

एसक्यूएल में यह एक बहुत ही सामान्य प्रश्न है:कुछ समूह पहचानकर्ता प्रति कॉलम में कुछ अधिकतम मान वाली पंक्ति के लिए संपूर्ण डेटा ढूंढें। मैंने अपने करियर के दौरान बहुत कुछ सुना। वास्तव में, यह एक प्रश्न था जिसका उत्तर मैंने अपनी वर्तमान नौकरी के तकनीकी साक्षात्कार में दिया था।

वास्तव में, यह इतना सामान्य है कि स्टैक ओवरफ्लो समुदाय ने इस तरह के प्रश्नों से निपटने के लिए एक ही टैग बनाया है:

मूल रूप से, उस समस्या को हल करने के लिए आपके पास दो दृष्टिकोण हैं:

साधारण group-identifier, max-value-in-group उप-क्वेरी

इस दृष्टिकोण में, आप सबसे पहले group-identifier, max-value-in-group . पाते हैं (पहले से ही ऊपर हल किया गया) एक उप-क्वेरी में। फिर आप group-identifier . दोनों पर समानता के साथ अपनी तालिका को उप-क्वेरी में शामिल करते हैं और max-value-in-group :

SELECT a.id, a.rev, a.contents
FROM YourTable a
INNER JOIN (
    SELECT id, MAX(rev) rev
    FROM YourTable
    GROUP BY id
) b ON a.id = b.id AND a.rev = b.rev

स्वयं के साथ जुड़ना छोड़ दिया, जुड़ने की स्थिति और फ़िल्टर में बदलाव किया

इस दृष्टिकोण में, आप अपने साथ तालिका में शामिल होना छोड़ देते हैं। समानता group-identifier में जाती है . फिर, 2 स्मार्ट चालें:

  1. दूसरी जॉइन कंडीशन में लेफ्ट साइड वैल्यू राइट वैल्यू से कम है
  2. जब आप चरण 1 करते हैं, तो जिन पंक्तियों का वास्तव में अधिकतम मान होता है, उनमें NULL होगा दाईं ओर (यह एक LEFT JOIN है) , याद रखना?)। फिर, हम सम्मिलित परिणाम को फ़िल्टर करते हैं, केवल उन पंक्तियों को दिखाते हैं जहाँ दाईं ओर NULL . है ।

तो आप इसके साथ समाप्त होते हैं:

SELECT a.*
FROM YourTable a
LEFT OUTER JOIN YourTable b
    ON a.id = b.id AND a.rev < b.rev
WHERE b.id IS NULL;

निष्कर्ष

दोनों दृष्टिकोण एक ही परिणाम लाते हैं।

यदि आपके पास max-value-in-group वाली दो पंक्तियां हैं group-identifier . के लिए , दोनों पंक्तियाँ दोनों दृष्टिकोणों में परिणाम में होंगी।

दोनों दृष्टिकोण SQL ANSI संगत हैं, इस प्रकार, आपके पसंदीदा RDBMS के साथ काम करेंगे, चाहे उसका "स्वाद" कुछ भी हो।

दोनों दृष्टिकोण भी प्रदर्शन के अनुकूल हैं, हालाँकि आपका माइलेज भिन्न हो सकता है (RDBMS, DB संरचना, अनुक्रमणिका, आदि)। इसलिए जब आप एक दृष्टिकोण को दूसरे के ऊपर चुनते हैं, बेंचमार्क . और सुनिश्चित करें कि आप वही चुनें जो आपके लिए सबसे ज्यादा मायने रखता हो।



  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. मैं mysql देशी json फ़ंक्शन का उपयोग करके नेस्टेड json ऑब्जेक्ट कैसे उत्पन्न करूं?

  3. SQL क्वेरी MySQL में डेटाबेस बनाने के लिए

  4. MySQL में क्रॉस/आउटर अप्लाई

  5. MySQL ड्रॉप व्यू