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

पोस्टग्रेएसक्यूएल 13:LIMIT … TIES के साथ

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;

यह सुविधा आपको उन सभी पंक्तियों को दिखाने में मदद करने के लिए है जो समान मूल्य की हैं - यह आपको केवल तालिका के भीतर भौतिक स्थान के आधार पर समान मूल्य की कुछ पंक्तियों के साथ भेदभाव नहीं करने देती है।

हैप्पी पेजिंग!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL में समवर्ती घटनाओं की संख्या की गणना करें

  2. मैं यह कैसे सुनिश्चित कर सकता हूं कि एक भौतिक दृश्य हमेशा अप टू डेट हो?

  3. PSQLException:त्रुटि:संबंध TABLE_NAME मौजूद नहीं है

  4. किसी तालिका या दृश्य के लिए आश्रित वस्तुओं का पता लगाएं

  5. dplyr left_join से कम, शर्त से बड़ा