ROW_NUMBER से प्रति समूह शीर्ष-N ROW
'प्रत्येक श्रेणी के शीर्ष 3' के लिए मानक PARTITION और रैंक पैटर्न सीखें
ROW_NUMBER से प्रति समूह शीर्ष-N ROW, CoddyKit पर कोडिंग साक्षात्कार की तैयारी का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह कोडिंग साक्षात्कार की तैयारी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
प्रत्येक समूह के शीर्ष-N का प्रश्न
SQL साक्षात्कार के सबसे आम प्रश्नों में से एक सरल सुनाई देता है: “प्रत्येक विभाग में सबसे अधिक वेतन पाने वाले शीर्ष 3 कर्मचारियों को लौटाइए।” जो अभ्यर्थी तुरंत LIMIT का उपयोग करते हैं, वे असफल हो जाते हैं, क्योंकि LIMIT प्रत्येक समूह पर नहीं, बल्कि पूरे परिणाम-समुच्चय पर सीमा लगाता है।
साक्षात्कारकर्ता यह जाँच रहा है कि क्या आप विंडो फ़ंक्शन जानते हैं। मानक उत्तर है: प्रत्येक समूह के भीतर पंक्तियों को क्रमांक दें, फिर उन पंक्तियों को रखें जिनका क्रमांक ≤ N है। यह पाठ उस तरीके को चरण-दर-चरण बनाता है।
LIMIT इसे क्यों हल नहीं कर सकता
मान लीजिए कि आप नीचे दी गई क्वेरी लिखते हैं। यह पूरे सारणी में कुल मिलाकर केवल 3 पंक्तियाँ लौटाती है, प्रत्येक विभाग से 3 पंक्तियाँ नहीं।
LIMIT (या TOP, या FETCH FIRST) अंतिम परिणाम-समुच्चय पर लागू होता है। मानक SQL में प्रत्येक समूह के लिए अलग LIMIT नहीं होता। जब साक्षात्कारकर्ता आपको प्रत्येक समूह की समस्या के लिए LIMIT 3 सुझाते सुनता है, तो इससे संकेत मिलता है कि आप विभाजन की अवधारणा को पूरी तरह नहीं समझ पाए हैं।
-- WRONG: only 3 rows total, not 3 per department
SELECT department, name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;ROW_NUMBER से परिचय
ROW_NUMBER() एक विंडो फ़ंक्शन है जो किसी क्रम के अनुसार प्रत्येक पंक्ति को बिना अंतर वाला अद्वितीय पूर्णांक देता है। अपने आप यह पूरे परिणाम को क्रमांकित करता है।
मुख्य बात है PARTITION BY: यह हर समूह के लिए क्रमांकन को 1 से फिर शुरू करता है। PARTITION BY department को ORDER BY salary DESC के साथ मिलाने पर प्रत्येक विभाग को वेतन के आधार पर अपना 1, 2, 3, ... क्रम मिलता है।
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS rn
FROM employees;क्रमांकित परिणाम को समझना
पिछली क्वेरी चलाने के बाद हर पंक्ति में rn मान होता है। प्रत्येक विभाग में सबसे अधिक वेतन वाली पंक्ति को rn = 1, अगली को 2 और इसी तरह क्रम मिलता है। नया विभाग शुरू होते ही क्रम फिर 1 से शुरू होता है।
- बिक्री: Ana (1), Bo (2), Cal (3), Dee (4)
- इंजीनियरिंग: Eve (1), Fin (2), Gus (3)
अब “प्रत्येक विभाग के शीर्ष 3” का अर्थ बस “उन पंक्तियों को रखें जहाँ rn <= 3” है।
WHERE में rn पर छनाई नहीं कर सकते
स्वाभाविक अगला कदम WHERE rn <= 3 लिखना है, लेकिन यह विफल होता है। तार्किक निष्पादन क्रम में विंडो फ़ंक्शन की गणना WHERE खंड के बाद होती है, इसलिए WHERE के चलने पर rn उपनाम अभी मौजूद नहीं होता।
साक्षात्कारकर्ता इस जाल का उपयोग करना पसंद करते हैं। समाधान यह है कि विंडो फ़ंक्शन की गणना किसी उप-क्वेरी या CTE में करें, फिर बाहरी क्वेरी में उस आंतरिक क्वेरी के परिणाम पर छनाई लगाएँ।
-- ERROR: rn does not exist in WHERE
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
WHERE rn <= 3;मानक CTE समाधान
क्रमांकन को ranked नाम वाले CTE में रखें, फिर बाहरी WHERE में छनाई लगाकर उससे चयन करें। यही वह उत्तर है जिसे साक्षात्कारकर्ता देखना चाहते हैं और यह साफ़-सुथरा भी है।
इस ढाँचे को याद रखें: समूह के आधार पर विभाजन करें, मापदंड के आधार पर क्रम दें, और बाहरी क्वेरी में rn ≤ N पर छनाई करें। एक संख्या बदलकर इसे शीर्ष-1, शीर्ष-5 या किसी भी N पर लागू किया जा सकता है।
WITH ranked AS (
SELECT
name, department, salary,
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS rn
FROM employees
)
SELECT name, department, salary
FROM ranked
WHERE rn <= 3
ORDER BY department, rn;उप-क्वेरी वाला रूप
यदि साक्षात्कारकर्ता की SQL बोली पुरानी है या वे उप-क्वेरी पसंद करते हैं, तो यही तर्क FROM में किसी व्युत्पन्न तालिका के भीतर रखा जा सकता है। याद रखें कि व्युत्पन्न तालिका का उपनाम होना अनिवार्य है (यहाँ r), वरना वाक्यविन्यास त्रुटि मिलेगी।
CTE और व्युत्पन्न-तालिका वाले रूप इस समस्या के लिए एक-दूसरे के बदले इस्तेमाल किए जा सकते हैं। साक्षात्कारकर्ता को जो अधिक पठनीय लगे, वही चुनें; दोनों समान रूप से सही हैं।
SELECT name, department, salary
FROM (
SELECT name, department, salary,
ROW_NUMBER() OVER (
PARTITION BY department ORDER BY salary DESC
) AS rn
FROM employees
) AS r
WHERE rn <= 3;शीर्ष-1: प्रत्येक समूह का सबसे अच्छा
“प्रत्येक विभाग में सबसे अधिक वेतन पाने वाले एक कर्मचारी को खोजिए” का अर्थ बस N = 1 है। छनाई को rn = 1 पर सेट करें।
GROUP BY department के साथ MAX(salary) का उपयोग क्यों न करें? क्योंकि MAX आपको वेतन का मान तो देता है, लेकिन उस कर्मचारी की पंक्ति के बाकी विवरण (नाम, नियुक्ति की तारीख आदि) नहीं देता। ROW_NUMBER पूरी विजेता पंक्ति को सुरक्षित रखता है, जो आमतौर पर प्रश्न का वास्तविक आशय होता है।
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY department ORDER BY salary DESC
) AS rn
FROM employees
)
SELECT name, department, salary, hire_date
FROM ranked
WHERE rn = 1;नियतात्मक टाई-ब्रेकर जोड़ना
वेतन समान होने पर भी ROW_NUMBER हमेशा ठीक N पंक्तियाँ लौटाता है। लेकिन कौन-सी समान वेतन वाली पंक्ति को rn = 1 मिलेगा, यह टाई का निर्णय किए बिना मनमाना होता है। यदि दो लोगों का वेतन 90000 है और आप केवल rn = 1 रखते हैं, तो हर बार चलाने पर चुनी गई पंक्ति बदल सकती है।
employee_id जैसी द्वितीयक, अद्वितीय क्रम-कुंजी जोड़ें, ताकि परिणाम स्थिर और दोहराए जा सकें। बिना पूछे नियतात्मकता का उल्लेख करने वाले अभ्यर्थियों को साक्षात्कारकर्ता अतिरिक्त अंक देते हैं।
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC, employee_id ASC
) AS rnठोस उदाहरण
sales सारणी में region, product और revenue दिए गए हैं। प्रत्येक क्षेत्र में आय के आधार पर शीर्ष 2 उत्पाद लौटाइए। वही तरीका अपनाएँ: region के आधार पर विभाजन करें, revenue DESC के आधार पर क्रम दें और rn <= 2 वाली पंक्तियाँ रखें।
ध्यान दें कि केवल विभाजन वाले कॉलम और मापदंड वाले कॉलम बदलते हैं। व्यावसायिक क्षेत्र चाहे कोई भी हो, संरचना समान रहती है।
WITH ranked AS (
SELECT region, product, revenue,
ROW_NUMBER() OVER (
PARTITION BY region ORDER BY revenue DESC, product
) AS rn
FROM sales
)
SELECT region, product, revenue
FROM ranked
WHERE rn <= 2
ORDER BY region, rn;प्रदर्शन और चर्चा के बिंदु
सिर्फ सही उत्तर से आगे प्रभाव डालने के लिए इन बातों का उल्लेख करें:
(department, salary DESC)पर बना अनुक्रमणिका इंजन को प्रत्येक विभाजन के लिए क्रमबद्ध पंक्तियाँ कुशलतापूर्वक तैयार करने में सहायता करती है।- विंडो वाला तरीका सारणी को एक बार पढ़ता है, जो हर पंक्ति पर चलने वाली सहसंबद्ध उप-क्वेरी से कहीं बेहतर है।
- बहुत बड़े शीर्ष-N-में-से-1 मामलों के लिए कुछ इंजन
DISTINCT ON(Postgres) को संक्षिप्त विकल्प के रूप में समर्थित करते हैं, लेकिनROW_NUMBERविभिन्न SQL प्रणालियों में चलने वाला मानक है।
हमेशा अपना टाई-ब्रेकर स्पष्ट करें और माँगे गए N की पुष्टि करें।
त्वरित जाँच
प्रत्येक समूह के शीर्ष-N वाले तरीके की अपनी समझ जाँचें।
दोहराव: प्रत्येक समूह के शीर्ष-N
पूरे तरीके को एक साँस में कहें: समूह के आधार पर विभाजन करें, मापदंड के आधार पर क्रम दें, ROW_NUMBER दें, फिर बाहरी क्वेरी में rn ≤ N वाली पंक्तियाँ रखें।
LIMITपूरे समुच्चय पर सीमा लगाता है, प्रत्येक समूह पर नहीं।- विंडो वाले उपनाम पर
WHEREमें छनाई नहीं लगा सकते; उसे CTE या उप-क्वेरी में रखें। - नियतात्मक परिणामों के लिए अद्वितीय टाई-ब्रेकर जोड़ें।
- शीर्ष-1 में
MAX+GROUP BYके विपरीत पूरी विजेता पंक्ति मिलती है।
एक संख्या बदलकर यही क्वेरी शीर्ष-1, शीर्ष-5 या किसी भी N की समस्या हल कर देती है।
एआई शिक्षक के साथ कोडिंग साक्षात्कार की तैयारी सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 90
- पाठ
- 360
अक्सर पूछे जाने वाले प्रश्न
क्या “ROW_NUMBER से प्रति समूह शीर्ष-N ROW” पाठ निःशुल्क है?
हाँ—“ROW_NUMBER से प्रति समूह शीर्ष-N ROW” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“ROW_NUMBER से प्रति समूह शीर्ष-N ROW” में मैं क्या सीखूँगा?
'प्रत्येक श्रेणी के शीर्ष 3' के लिए मानक PARTITION और रैंक पैटर्न सीखें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ कोडिंग साक्षात्कार की तैयारी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या कोडिंग साक्षात्कार की तैयारी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर कोडिंग साक्षात्कार की तैयारी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“ROW_NUMBER से प्रति समूह शीर्ष-N ROW” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस कोडिंग साक्षात्कार की तैयारी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर कोडिंग साक्षात्कार की तैयारी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- ROW_NUMBER से प्रति समूह शीर्ष-N ROW
- शीर्ष-N में टाई संभालना
- ROW से डुप्लिकेट सुरक्षित रूप से हटाना
- प्रति कुंजी नवीनतम ROW रखना