PostgreSQL 13 में नई सुविधाओं में से एक है SQL-मानक WITH TIES
LIMIT
. के साथ प्रयोग करने के लिए क्लॉज - या, जैसा कि मानक कहता है, FETCH FIRST n ROWS
. प्रारंभिक पैच लेखक के रूप में सुरफेल टेम्सजेन के कारण धन्यवाद; कुछ अतिरिक्त कोड सुधारों के लिए टॉमस वोंड्रा और आपका सही मायने में; और समीक्षक एंड्रयू गीर्थ और एरिक रिजकर्स। आप प्रतिबद्ध संदेश का उपयोग कर सकते हैं।
चीजों की रैंकिंग करते समय संबंध बहुत बार होते हैं; उदाहरण के लिए, कॉकस रेस में आपके कई संबंध हो सकते हैं, और निश्चित रूप से आप प्रतिभागियों को उनके पुरस्कारों से वंचित नहीं करना चाहते हैं! क्या WITH TIES
यह बहुत आसान है:यह आपके परिणाम सेट में कोई भी निम्न पंक्ति या पंक्तियों को जोड़ता है, यदि वे LIMIT
के अनुसार अंतिम पंक्ति के बराबर रैंक करते हैं क्लॉज, ORDER BY
. के अनुसार खंड।
यदि आप केवल दो कर्मचारियों को उच्चतम वेतन चाहते हैं, तो आप यह कर सकते हैं:
SELECT * FROM employees ORDER BY salary DESC LIMIT 2;
नाम | <थ>वेतनविभाग | |
---|---|---|
एलिसिया | 1600 | इंजीनियरिंग |
ओरुगा | 1500 | विपणन |
तो क्या आप अगले व्यक्ति का वेतन जानने के लिए खुजली कर रहे हैं? क्या होगा अगर वह ओरुगा से मेल खाती है, और सिर्फ शुद्ध संयोग या दुर्भाग्य से छोड़ दिया गया था? ऐसा हो सकता है, जैसा कि आप अच्छी तरह जानते हैं; और सौभाग्य से, WITH TIES
अब दिन बचाने के लिए है। (ध्यान दें कि, वास्तव में, हम WITH TIES
. को हैंडल नहीं करते हैं LIMIT
. में खंड के रूप में। आपको FETCH FIRST
. का उपयोग करना होगा सिंटैक्स, जो मानक-अनिवार्य है, ताकि WITH TIES
का उपयोग करने में सक्षम हो सके ।)
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 2 ROWS WITH TIES;
नाम | <थ>वेतनविभाग | |
---|---|---|
एलिसिया | 1600 | इंजीनियरिंग |
ओरुगा | 1500 | बिक्री |
कोनेजो ब्लैंको | 1500 | विपणन |
वहाँ! सफेद खरगोश था सूचीबद्ध होने के लिए, और अब वह है।
आपके बहुत पागल होने से पहले एक दो नोट। LIMIT
(या अधिक सटीक FETCH FIRST
) अब आपके द्वारा निर्दिष्ट पंक्तियों की संख्या को वापस करने का वादा नहीं करता है। आप दो या बीस अतिरिक्त पंक्तियाँ प्राप्त कर सकते हैं, या जितनी पंक्तियाँ माँगी हैं उतनी 100x पंक्तियाँ प्राप्त कर सकते हैं। अन्य बातों के अलावा, इसका मतलब यह है कि यदि आप परिणामों को पृष्ठांकित कर रहे हैं, तो आपको इस बात पर नज़र रखने की आवश्यकता है कि आपने अब तक कितनी पंक्तियों को देखा है। उपरोक्त में, आपको तीन पंक्तियाँ मिली हैं, इसलिए अगले पृष्ठ के लिए आप सही OFFSET
जोड़कर उन पंक्तियों को छोड़ दें। खंड:
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
नाम | <थ>वेतनविभाग | |
---|---|---|
फाल्सा टोर्टुगा | 1400 | विपणन |
डुक्वेसा | 1300 | बिक्री |
लिब्रे डी मार्ज़ो | 1300 | इंजीनियरिंग |
हमने जो मांगा था, उसके बजाय हमें फिर से तीन मिले। तो अगले पेज के लिए आपको छह छोड़ना होगा। और इसी तरह। सुनिश्चित करें कि सभी के लिए पर्याप्त अंगूठे हों।
ध्यान रखने वाली दूसरी बात यह है कि आपको केवल ORDER BY
. का उपयोग करना सुनिश्चित करना चाहिए क्लॉज जो WITH TIES
. के अनुकूल हो खंड; यदि आप चाहते हैं, कहते हैं, समान वेतन की पंक्तियों को नाम से क्रमित करने के लिए, आपको एक सबक्वेरी का उपयोग करना होगा। अन्यथा, नामों में अंतर वेतन पर टाई को हल कर देगा, इसलिए अगली पंक्ति को शामिल नहीं किया जाएगा। उदाहरण के लिए:
SELECT * FROM (
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES) AS subq
ORDER BY salary DESC, name;
यह सुविधा आपको उन सभी पंक्तियों को दिखाने में मदद करने के लिए है जो समान मूल्य की हैं - यह आपको केवल तालिका के भीतर भौतिक स्थान के आधार पर समान मूल्य की कुछ पंक्तियों के साथ भेदभाव नहीं करने देती है।
हैप्पी पेजिंग!