RANK-funktionen i SQL Server är en sorts rankningsfunktion. Denna funktion kommer tilldela numret till varje rad inom partitionen för en utgång . Den tilldelar rangen till varje rad som en plus den föregående radrankningen. När RANK-funktionen hittar två värden som är identiska inom samma partition, tilldelar den dem samma rangnummer. Dessutom kommer nästa nummer i rankningen att vara den föregående rankningen plus dubblettnummer. Därför tilldelar den här funktionen inte alltid rangordningen av rader i följd.
RANK-funktionen är också en underdel av fönsterfunktioner. Följande punkter bör komma ihåg när du använder denna funktion :
- Det fungerar alltid med OVER()-satsen.
- Den tilldelar en rangordning till varje rad baserat på ORDER BY-satsen.
- Den tilldelar en rangordning till varje rad i följd.
- Den tilldelar alltid en rangordning till rader, med början med en för varje ny partition.
OBS: Rank tilldelar temporära värden för rader inom partitionen när frågan exekveras.
SQL Server tillhandahåller följande rankningsfunktioner :
- RANG()
- ROW_NUMBER()
- DENSE_RANK()
- NTILE()
Låt oss lära oss varje rangfunktion i detalj. Först kommer vi att skapa en tabell för demonstration av alla dessa funktioner. Följande satser skapar en tabell med namnet rank_demo med tre kolumner:
CREATE TABLE rank_demo ( first_name VARCHAR(60), last_name VARCHAR(40), city VARCHAR(30) );
Därefter kommer vi att infoga några rader i den här tabellen enligt nedan:
sorterad arraylist i java
INSERT INTO rank_demo (first_name, last_name, city) VALUES ('Luisa', 'Evans', 'Texas'), ('Paul', 'Ward', 'Alaska'), ('Peter', 'Bennett', 'California'), ('Carlos', 'Patterson', 'New York'), ('Rose', 'Huges', 'Florida'), ('Marielia', 'Simmons', 'Texas'), ('Antonio', 'Butler', 'New York'), ('Diego', 'Cox', 'California');
Vi kan verifiera tabellen med hjälp av SELECT-satsen. Den visar följande utdata:
RANK() Funktion
Denna funktion används för att bestämma rangordningen för varje rad i resultatuppsättningen. Följande syntax illustrerar användningen av en RANK-funktion i SQL Server:
SELECT column_name RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
I denna syntax,
- De ÖVER klausul ställer in partitionering och ordning av ett resultat innan den tillhörande fönsterfunktionen tillämpas.
- De PARTITION BY-klausul delar upp utdata som produceras av FROM-satsen i partitionen. Sedan appliceras funktionen på varje partition och återinitieras när divisionsgränsen korsar partitioner. Om vi inte har definierat denna klausul kommer funktionen att behandla alla rader som en enda partition.
- De SORTERA EFTER är en obligatorisk sats som bestämmer ordningen på raderna på ett fallande eller stigande sätt baserat på ett eller flera kolumnnamn innan funktionen tillämpas.
Exempel
Låt oss se hur RANK()-funktionen fungerar i SQL Server. Nedanstående uttalande kommer att använda rangfunktionen för att tilldela numrering för varje rad:
SELECT first_name, last_name, city, RANK () OVER (ORDER BY city) AS Rank_No FROM rank_demo;
Eftersom vi inte har använt PARTITION BY-klausul , behandlade funktionen hela resultatet som en enda partition. Om du kör satsen visas följande utdata:
runas i powershell
I den här utgången kan vi se att några av raderna får samma rang eftersom de har samma värde i stad kolumn . Och nästa nummer i rankningen kommer att vara dess tidigare rankning plus ett antal dubbletter.
Följande uttalande är ett annat exempel där vi kommer att använda en partition by-sats som delar upp raderna baserat på stad kolumn och tilldela en rangordning till varje rad inom en partition. Ordningen på utdata baseras på förnamn :
SELECT first_name, last_name, city, RANK () OVER (PARTITION BY city ORDER BY first_name) AS Rank_No FROM rank_demo;
Det kommer att visa nedanstående utdata:
ROW_NUMBER() Funktion
Denna funktion används för att returnera det unika sekvensnumret för varje rad inom dess partition. Radnumreringen börjar vid ett och ökar med en tills partitionens totala antal rader uppnås. Det kommer att returnera de olika rangorden för raden som har liknande värden som gör den annorlunda än RANK()-funktionen.
Syntaxen nedan illustrerar användningen av en ROW_NUMBER() funktion i SQL Server:
SELECT column_name ROW_NUMBER() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
Exempel
Kör följande fråga för att tilldela ett sekvensnummer för varje rad:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city) AS my_rank FROM rank_demo;
Det kommer att tilldela rankningen för tabellen enligt deras stad . Här kan vi se att den tilldelar olika rangordningar för raden som har samma stadsvärden.
Om vi ändrar sorteringsordningen från stigande till fallande med ORDER BY-satsen kommer denna funktion också att ändra RANK i enlighet med detta. Se nedanstående uttalande:
SELECT first_name, last_name, city, ROW_NUMBER() OVER(ORDER BY city DESC) AS my_rank FROM rank_demo;
Här är resultatet:
DENSE_RANK() Funktion
Denna funktion tilldelar en unik rangordning för varje rad inom en partition enligt det angivna kolumnvärdet utan några luckor. Den anger alltid rangordning i följd. Om vi får en dubblettvärde , kommer den här funktionen att tilldela den samma rang, och nästa rang är nästa sekvensnummer. Denna egenskap skiljer sig DENSE_RANK()-funktionen från RANK()-funktionen.
java-tecken till int
Syntaxen nedan illustrerar användningen av en DENSE_RANK()-funktion i SQL Server:
SELECT column_name DENSE_RANK() OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'rank_name' FROM table_name;
Exempel
Följande fråga använder funktionen DENSE_RANK() för att tilldela ett rangnummer för varje rad:
SELECT first_name, last_name, city, DENSE_RANK() OVER(ORDER BY city) AS my_rank FROM rank_demo;
Det kommer att returnera nedanstående utdata där vi kan se att dubblettvärdena har samma rang, och följande rang kommer att vara nästa sekventiella nummer.
Det är ett annat exempel på DENSE_RANK()-funktionen genom att använda PARTITION BY-satsen. Denna sats delar upp raderna baserat på stadskolumnen, och ordningen för en resultatuppsättning baseras på förnamn:
SELECT first_name, last_name, city, DENSE_RANK() OVER(PARTITION BY city ORDER BY first_name) AS my_rank FROM rank_demo;
Vi kommer att få utdata nedan eftersom inga två namn är desamma. I det här fallet liknar utmatningen RANK()-funktionen.
Låt oss uppdatera namnet med följande fråga:
java-strängformatering
Update rank_demo set first_name = 'Diego' WHERE city = 'California'
Kör nu samma fråga igen. Vi kommer att se att denna tabell fick samma namn Kalifornien City . Därför är rangen också densamma för båda namnen.
NTILE(N) Funktion
Denna funktion används för att fördela rader av en ordnad partition till ett fördefinierat antal (N) av ungefär lika stora grupper. Varje radgrupp får sin rangordning baserat på det definierade villkoret och börjar numrera från en grupp. Den tilldelar en hinknummer för varje rad i en grupp som representerar gruppen som den tillhör.
Följande syntax illustrerar användningen av en NTILE()-funktion i SQL Server:
SELECT column_name NTILE(N) OVER ( PARTITION BY expression ORDER BY expression [ASC|DESC]) AS 'my_rank' FROM table_name;
Exempel
Följande fråga använder funktionen NTILE() för att tilldela ett rangnummer för varje rad:
SELECT first_name, last_name, city, NTILE(3) OVER(ORDER BY city) AS my_rank FROM rank_demo;
Den angivna tabellen har åtta rekord . Därför NTILE(3) berättar att resultatuppsättningen måste ha en grupp om tre skivor . Om du kör satsen visas följande utdata:
Den här artikeln kommer att förklara alla RANK-funktioner som används i SQL Server med olika exempel. Den visar också de viktigaste skillnaderna mellan dessa funktioner. Dessa funktioner är mycket användbara för utvecklare för att utforska och hantera sina data väl.