पहली नज़र में...
आपको बस एक 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 करते हैं, तो जिन पंक्तियों का वास्तव में अधिकतम मान होता है, उनमें
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 संरचना, अनुक्रमणिका, आदि)। इसलिए जब आप एक दृष्टिकोण को दूसरे के ऊपर चुनते हैं, बेंचमार्क . और सुनिश्चित करें कि आप वही चुनें जो आपके लिए सबसे ज्यादा मायने रखता हो।