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

SQL सर्वर में ROW_NUMBER () कैसे काम करता है

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 से शुरू करने का कारण बनता है।


  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 सर्वर ईवेंट कैप्चर करने के लिए SQL ट्रेस कैसे बनाएं?

  2. दिनांक स्ट्रिंग को बदलने और मान्य करने का सबसे अच्छा तरीका

  3. प्रत्येक पंक्ति में स्तंभ मान के आधार पर पंक्तियों की नकल करना

  4. क्या कोई विदेशी कुंजी NULL और/या डुप्लिकेट हो सकती है?

  5. एन्क्रिप्टेड कनेक्शन SQL सर्वर के लिए प्रमाणपत्र परिनियोजित करना