SQL सर्वर में, ROW_NUMBER()
फ़ंक्शन आपको परिणाम सेट के आउटपुट को क्रमांकित करने की अनुमति देता है। यह 1 से शुरू होकर प्रत्येक पंक्ति की अनुक्रमिक संख्या देता है।
यदि आप परिणाम सेट के लिए विभाजन निर्दिष्ट करते हैं, तो प्रत्येक विभाजन नंबरिंग को फिर से शुरू करने का कारण बनता है (अर्थात प्रत्येक विभाजन में पहली पंक्ति के लिए नंबरिंग 1 से शुरू होगी)।
सिंटैक्स
वाक्य रचना इस प्रकार है:
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
PARTITION BY value_expression
वैकल्पिक है। यह FROM
. द्वारा निर्मित परिणाम सेट को विभाजित करता है विभाजन में खंड जिस पर फ़ंक्शन लागू होता है। value_expression उस कॉलम को निर्दिष्ट करता है जिसके द्वारा परिणाम सेट को विभाजित किया जाता है। अगर PARTITION BY
खंड निर्दिष्ट नहीं है, क्वेरी परिणाम सेट की सभी पंक्तियों को एक समूह के रूप में माना जाता है।
ROW_NUMBER
सौंपा जाता है एक निर्दिष्ट विभाजन के भीतर।
ध्यान दें कि OVER
क्लॉज आम तौर पर
उदाहरण 1 - मूल उपयोग
यह फ़ंक्शन कैसे काम करता है, इसका एक बुनियादी उदाहरण यहां दिया गया है:
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumName FROM Albums;
परिणाम:
+-------+-----------+--------------------------+ | Row | AlbumId | AlbumName | |-------+-----------+--------------------------| | 1 | 1 | Powerslave | | 2 | 2 | Powerage | | 3 | 3 | Singing Down the Lane | | 4 | 4 | Ziltoid the Omniscient | | 5 | 5 | Casualties of Cool | | 6 | 6 | Epicloud | | 7 | 7 | Somewhere in Time | | 8 | 8 | Piece of Mind | | 9 | 9 | Killers | | 10 | 10 | No Prayer for the Dying | | 11 | 11 | No Sound Without Silence | | 12 | 12 | Big Swing Face | | 13 | 13 | Blue Night | | 14 | 14 | Eternity | | 15 | 15 | Scandinavia | | 16 | 16 | Long Lost Suitcase | | 17 | 17 | Praise and Blame | | 18 | 18 | Along Came Jones | | 19 | 19 | All Night Wrong | | 20 | 20 | The Sixteen Men of Tain | | 21 | 21 | Yo Wassup | | 22 | 22 | Busted | +-------+-----------+--------------------------+
इस मामले में हम देख सकते हैं कि पंक्ति संख्या AlbumId
में मानों के साथ पूरी तरह से संरेखित होती है कॉलम। यह विशुद्ध संयोग है। ऐसा इसलिए होता है क्योंकि AlbumId
कॉलम 1 से शुरू होने वाले वृद्धिशील मान का उपयोग कर रहा है, जो कि ROW_NUMBER()
. भी है उपयोग करता है।
पंक्ति क्रमांकन AlbumId
. से सहसंबद्ध है कॉलम उस सीमा तक है जो उस कॉलम द्वारा ऑर्डर किया गया है। लेकिन इसका मतलब यह नहीं है कि मान समान होने चाहिए।
उदाहरण 2 - WHERE क्लॉज जोड़ें
एक WHERE
जोड़ना खंड प्रदर्शित करेगा कि मेरा क्या मतलब है।
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumName FROM Albums WHERE AlbumId > 15;
परिणाम:
+-------+-----------+-------------------------+ | Row | AlbumId | AlbumName | |-------+-----------+-------------------------| | 1 | 16 | Long Lost Suitcase | | 2 | 17 | Praise and Blame | | 3 | 18 | Along Came Jones | | 4 | 19 | All Night Wrong | | 5 | 20 | The Sixteen Men of Tain | | 6 | 21 | Yo Wassup | | 7 | 22 | Busted | +-------+-----------+-------------------------+
उदाहरण 3 - ऑर्डरिंग स्विच करें
आरोही के बजाय अवरोही क्रम से क्रमबद्ध करना भी इस अवधारणा को प्रदर्शित करता है।
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId DESC) 'Row', AlbumId, AlbumName FROM Albums;
परिणाम:
+-------+-----------+--------------------------+ | Row | AlbumId | AlbumName | |-------+-----------+--------------------------| | 1 | 22 | Busted | | 2 | 21 | Yo Wassup | | 3 | 20 | The Sixteen Men of Tain | | 4 | 19 | All Night Wrong | | 5 | 18 | Along Came Jones | | 6 | 17 | Praise and Blame | | 7 | 16 | Long Lost Suitcase | | 8 | 15 | Scandinavia | | 9 | 14 | Eternity | | 10 | 13 | Blue Night | | 11 | 12 | Big Swing Face | | 12 | 11 | No Sound Without Silence | | 13 | 10 | No Prayer for the Dying | | 14 | 9 | Killers | | 15 | 8 | Piece of Mind | | 16 | 7 | Somewhere in Time | | 17 | 6 | Epicloud | | 18 | 5 | Casualties of Cool | | 19 | 4 | Ziltoid the Omniscient | | 20 | 3 | Singing Down the Lane | | 21 | 2 | Powerage | | 22 | 1 | Powerslave | +-------+-----------+--------------------------+
उदाहरण 4 - एक अलग कॉलम के अनुसार ऑर्डर करें
और जब हम इस पर हों, तो AlbumName
. द्वारा आदेश दें इसके बजाय कॉलम।
SELECT ROW_NUMBER() OVER (ORDER BY AlbumName ASC) 'Row', AlbumId, AlbumName FROM Albums;
परिणाम:
+-------+-----------+--------------------------+ | Row | AlbumId | AlbumName | |-------+-----------+--------------------------| | 1 | 19 | All Night Wrong | | 2 | 18 | Along Came Jones | | 3 | 12 | Big Swing Face | | 4 | 13 | Blue Night | | 5 | 22 | Busted | | 6 | 5 | Casualties of Cool | | 7 | 6 | Epicloud | | 8 | 14 | Eternity | | 9 | 9 | Killers | | 10 | 16 | Long Lost Suitcase | | 11 | 10 | No Prayer for the Dying | | 12 | 11 | No Sound Without Silence | | 13 | 8 | Piece of Mind | | 14 | 2 | Powerage | | 15 | 1 | Powerslave | | 16 | 17 | Praise and Blame | | 17 | 15 | Scandinavia | | 18 | 3 | Singing Down the Lane | | 19 | 7 | Somewhere in Time | | 20 | 20 | The Sixteen Men of Tain | | 21 | 21 | Yo Wassup | | 22 | 4 | Ziltoid the Omniscient | +-------+-----------+--------------------------+
उदाहरण 5 - विभाजन
जैसा कि बताया गया है, आप परिणामों को विभाजन में भी विभाजित कर सकते हैं। जब आप ऐसा करते हैं, तो प्रत्येक नए विभाजन के लिए क्रमांकन फिर से 1 से शुरू होता है।
उदाहरण:
SELECT Genre, ROW_NUMBER() OVER (PARTITION BY Genre ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumName FROM Albums INNER JOIN Genres ON Albums.GenreId = Genres.GenreId;
परिणाम:
+---------+-------+-----------+--------------------------+ | Genre | Row | AlbumId | AlbumName | |---------+-------+-----------+--------------------------| | Country | 1 | 3 | Singing Down the Lane | | Country | 2 | 21 | Yo Wassup | | Country | 3 | 22 | Busted | | Jazz | 1 | 12 | Big Swing Face | | Jazz | 2 | 19 | All Night Wrong | | Jazz | 3 | 20 | The Sixteen Men of Tain | | Pop | 1 | 11 | No Sound Without Silence | | Pop | 2 | 13 | Blue Night | | Pop | 3 | 14 | Eternity | | Pop | 4 | 15 | Scandinavia | | Pop | 5 | 16 | Long Lost Suitcase | | Pop | 6 | 17 | Praise and Blame | | Pop | 7 | 18 | Along Came Jones | | Rock | 1 | 1 | Powerslave | | Rock | 2 | 2 | Powerage | | Rock | 3 | 4 | Ziltoid the Omniscient | | Rock | 4 | 5 | Casualties of Cool | | Rock | 5 | 6 | Epicloud | | Rock | 6 | 7 | Somewhere in Time | | Rock | 7 | 8 | Piece of Mind | | Rock | 8 | 9 | Killers | | Rock | 9 | 10 | No Prayer for the Dying | +---------+-------+-----------+--------------------------+
एक बार फिर हम देख सकते हैं कि ROW_NUMBER
और AlbumId
कॉलम पूरी तरह से असंबंधित हैं।
इस मामले में मैं Genre
. द्वारा विभाजित करता हूं कॉलम। यह प्रत्येक शैली के लिए नंबरिंग को फिर से 1 से शुरू करने का कारण बनता है।