Numărul de rând este cel mai frecvent functie de clasare utilizat în SQL Server. Funcția ROW_NUMBER(). generează un număr secvenţial pentru fiecare rând dintr-o partiţie în ieșirea rezultată. În fiecare partiție, numărul din primul rând începe cu 1. Trebuie să folosim întotdeauna COMANDA PENTRU clauză pentru a se asigura că numerele sunt atribuite în ordinea corectă. Valorile returnate de această funcție sunt de BIG INT tip de date. Această funcție vine cu SQL Server 2005 și versiunile ulterioare MS SQL.
ROW_NUMBER determină valoare temporară când interogarea este executată. Dacă doriți să obțineți numerele într-un tabel, trebuie să vedeți IDENTITATE proprietatea si SECVENŢĂ . Când funcția ROW_NUMBER din SQL Server întâlnește două valori identice în aceeași partiție, le atribuie numere de rang diferite. Numărul de rang va fi determinat de ordinea în care sunt afișate.
Nu există nicio garanție că valoarea returnată de această funcție va fi ordonată la fel pentru fiecare execuție, cu excepția cazului în care următoarele sunt adevărate:
- Valorile coloanelor partiționate sunt unice
- Valorile coloanelor ORDER BY sunt unice
- Combinația de coloane Partition and Order By sunt unice
Sintaxă
Următoarele sunt sintaxa care ilustrează funcția ROW_NUMBER():
ROW_NUMBER() OVER ( [PARTITION BY partition_expression, ... ] ORDER BY sort_expression [ASC | DESC], ... )
Să înțelegem sintaxa funcției ROW NUMBER():
PESTE
Este important să înțelegeți această clauză care specifică fereastra sau setul de rânduri pe care o operează funcția fereastră. PARTITION BY și ORDER BY sunt cele două clauze posibile ale clauzei OVER. Expresia ORDER BY a clauzei OVER este suportată atunci când rândurile trebuie să apară într-o anumită ordine pentru ca funcția să fie executată.
PARTIZARE DE
- Este o clauză opțională care împarte setul de rezultate în partiții (grupuri de rânduri). Apoi funcția ROW NUMBER() este aplicată fiecărei partiții și atribuie separat numărul de rang al fiecărei partiții.
- Dacă omitem partiția prin clauză, funcția ROW_NUMBER va trata întregul rezultat ca o singură partiție și va oferi clasament în ordinea de sus în jos.
COMANDA PENTRU
Această clauză ne permite să sortăm rândurile setului de rezultate din fiecare partiție. Este o clauză obligatorie deoarece funcția ROW_NUMBER() depinde de ordine.
Exemplu
Să înțelegem cum funcționează funcția ROW_NUMBER în tabelul SQL Server cu un exemplu. Mai întâi, vom crea un tabel numit „ Persoane ' folosind declarația de mai jos:
CREATE TABLE Persons ( person_name varchar(45) NOT NULL, product varchar(45) DEFAULT NULL, country varchar(25) DEFAULT NULL, price float, years int NOT NULL );
În continuare, vom adăuga câteva înregistrări în acest tabel folosind declarația de mai jos:
INSERT INTO Persons (person_name, product, country, price, years) VALUES ('Steffen', 'Computer', 'USA', 20000.00, 2018), ('Joseph', 'Laptop', 'India', 35000.00, 2016), ('Kevin', 'TV', 'USA', 15000.00, 2016), ('Thompson', 'Mobile', 'France', 12500.00, 2017), ('Donald', 'Laptop', 'England', 30000.00, 2018), ('Joseph', 'Mobile', 'India', 18000.00, 2018), ('Matthew', 'Desktop', 'France', 22000.00, 2017), ('Antonio', 'Mouse', 'England', 1200.00, 2016);
Apoi, verificați datele folosind SELECTAȚI afirmație. Vom obține rezultatul de mai jos:
1. Exemplu simplu ROW_NUMBER().
Următoarea afirmație afișează detaliile persoanei și adaugă un număr întreg secvențial la fiecare rând folosind ROW_NUMBER():
SELECT *, ROW_NUMBER() OVER (ORDER BY price) AS row_num FROM Persons;
Aici, nu am specificat clauza PARTITION BY, astfel încât funcția ROW_NUMBER() să trateze întregul set de rezultate ca o singură partiție. După executarea instrucțiunii, vom obține următorul rezultat:
2. ROW_NUMBER() peste Exemplu de partiții
Funcția ROW NUMBER() este utilizată în acest exemplu, furnizează un număr secvențial fiecărei înregistrări dintr-o partiție dintr-un tabel. A reinițializat întotdeauna numărul rândului când se schimbă anul:
SELECT person_name, product, price, years, ROW_NUMBER() OVER ( PARTITION BY years ORDER BY price) AS row_num FROM Persons;
Aici, am folosit clauza PARTITION BY care împarte „Persoane” tabel în partiții bazate pe 'ani' coloană. După execuție, vom obține rezultatul de mai jos:
3. ROW_NUMBER() Exemplu pentru paginare
Putem folosi și funcția ROW_NUMBER() pentru paginare. De exemplu , dacă dorim să obținem toate informațiile unei persoane într-o aplicație pe pagini, mai întâi vom atribui fiecărui rând un număr secvenţial utilizând funcţia ROW_NUMBER(). În al doilea rând, sortați rândurile după pagina solicitată.
Următoarea afirmație o explică mai clar:
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY price) AS row_num, person_name, product, price FROM Persons) P WHERE row_num > 3 AND row_num <= 6; < pre> <p>It will give the following output:</p> <img src="//techcodeview.com/img/sql-server-tutorials/96/sql-server-row-number-4.webp" alt="SQL Server Row Number"> <p>If we do not want to use the <strong>subquery</strong> , we can use the <strong>common table expression (CTE)</strong> as below statement:</p> <pre> WITH CTE_Person AS ( SELECT ROW_NUMBER() OVER (ORDER BY price) AS row_num, person_name, product, price FROM Persons) SELECT * FROM CTE_Person WHERE row_num > 3 AND row_num <= 6; < pre> <p>In this example, we have first specified the CTE that uses the ROW_NUMBER() function to assign each row in the result set sequentially. Second, the outer query returned the desired result. After execution, we will get the following output:</p> <img src="//techcodeview.com/img/sql-server-tutorials/96/sql-server-row-number-5.webp" alt="SQL Server Row Number"> <h3>Conclusion</h3> <p>In this article, we learned how to give a sequential number to each record within a partition of a query using the ROW NUMBER() function in SQL Server.</p> <hr></=></pre></=>=>