Vi utför beräkningar på data med olika aggregerade funktioner som Max, Min och avg. Vi får en enda utmatningsrad med hjälp av dessa funktioner. SQL Sever ger SQL RANK funktioner för att ange rank för enskilda fält enligt kategoriseringar. Den returnerar ett aggregerat värde för varje deltagande rad. SQL RANK funktioner vet också som fönsterfunktioner.
- Obs! Windows-termen avser inte Microsoft Windows-operativsystemet., Dessa är SQL RANK funktioner.
Vi har följande rankfunktioner.
- ROW_NUMBER ()
- RANK ()
- DENSE_RANK ()
- NTILE ()
i SQL RANK-funktionerna använder vi Over () – klausulen för att definiera en uppsättning rader i resultatuppsättningen. Vi kan också använda SQL PARTITION av klausul för att definiera en delmängd av data i en partition. Du kan också använda Order by-klausul för att sortera resultaten i en fallande eller stigande ordning.
innan vi utforskar dessa SQL RANK funktioner, låt oss förbereda provdata., I denna provdata har vi examensresultat för tre studenter i matematik, vetenskap och engelska ämnen.
Vi har följande exempeldata i Undersökningstabellen.
låt oss använda varje SQL Rank funktioner i kommande exempel.
ROW_NUMBER() SQL RANK function
Vi använder ROW_NUMBER() SQL RANK function för att få ett unikt sekventiellt nummer för varje rad i de angivna data. Det ger rangordningen en för den första raden och ökar sedan värdet med en för varje rad. Vi får olika LED för raden med liknande värden också.,
utför följande Fråga för att få en rang för studenter enligt deras betyg.,
1
2
3
4
5
|
SELECT Studentname,
Subject,
Marks,
ROW_NUMBER() OVER(ORDER BY Marks) RowNumber
FROM ExamResult;
|
By default, it sorts the data in ascending order and starts assigning ranks for each row., I ovanstående skärmdump får vi radnummer 1 för märken 50.
Vi kan ange fallande ordning med Order By klausul, och det ändrar rangen i enlighet därmed.,ae”>
1
2
3
4
5
|
SELECT Studentname,
Subject,
Marks,
ROW_NUMBER() OVER(ORDER BY Marks desc) RowNumber
FROM ExamResult;
|
RANK() SQL RANK Function
We use RANK() SQL Rank function to specify rank for each row in the result set., Vi har studentresultat för tre ämnen. Vi vill rangordna resultatet av studenter enligt deras betyg i ämnena. Till exempel, i följande skärmdump, student Isabella fick högsta betyg i engelska ämne och lägsta betyg i matematik ämne. Enligt märkena får Isabella den första rangen på engelska och 3: e plats i matematik ämne.
utför följande Fråga för att få denna resultatuppsättning.,v id=”c5a1f1b829″>
1
2
3
4
5
6
7
|
SELECT Studentname,
Subject,
Marks,
RANK() OVER(PARTITION BY Studentname ORDER BY Marks DESC) Rank
FROM ExamResult
ORDER BY Studentname,
Rank;
|
Let’s execute the following query of SQL Rank function and look at the result set., I den här frågan specificerade vi inte SQL-PARTITION efter klausul för att dela upp data i en mindre delmängd. Vi använder SQL Rank funktion med över klausul om Marks klausul (i fallande ordning) för att få leden för respektive rader.,div id=”7d9d5b54ae”>
1
2
3
4
5
6
|
SELECT Studentname,
Subject,
Marks,
RANK() OVER(ORDER BY Marks DESC) Rank
FROM ExamResult
ORDER BY Rank;
|
In the output, we can see each student get rank as per their marks irrespective of the specific subject., Till exempel är de högsta och lägsta märkena i den fullständiga resultatuppsättningen 90 respektive 50. I resultatuppsättningen blir det högsta märket RANK 1, och det lägsta märket blir RANK 9.
om två studenter får samma märken (i vårt exempel radnummer 4 och 5) är deras led också desamma.
DENSE_RANK() SQL RANK funktion
vi använder DENSE_RANK() funktion för att ange ett unikt ranknummer i partitionen enligt det angivna kolumnvärdet. Det liknar Rankfunktionen med en liten skillnad.,
i SQL RANK-funktionen DENSE_RANK(), om vi har dubbla värden, tilldelar SQL olika led till dessa rader också. Helst bör vi få samma rang för dubbla eller liknande värden.
låt oss utföra följande fråga med funktionen DENSE_RANK ().,
1
2
3
4
5
6
|
välj studentname,
ämne,
märken
dense_rank() över(order by Marks desc) rank
från examresult
order by rank;
|
i utgången kan du se att vi har samma rang för både Lily och Isabella som gjorde 70 poäng.,
låt oss använda DENSE_RANK-funktionen i kombination med SQL-partitionen efter klausul.,v id=”2d0aafc924″>
Vi har inte två studenter med liknande märken; därför resultat som liknar rank funktion i detta fall.,
låt oss uppdatera studentmärket med följande fråga och omdirigera frågan.
1
|
uppdatera examresult set Marks=70 där studentname=’Isabella’ och subject=’maths’
|
Vi kan se att Isabella i studentgruppen fick liknande märken i matematik och naturvetenskapliga ämnen., Rank är också densamma för båda ämnena i detta fall.
låt oss se skillnaden mellan RANK() och DENSE_RANK() SQL Rank-funktion med följande fråga.,b829″>
1
2
3
4
5
6
7
|
iv id=”
välj studentname,
ämne,
märken
dense_rank() över(partition av studentname order by Marks ) rank
från examresult
order by studentname,
rank;
|
i utmatningen kan du se gapet i rank-funktionen i partitionerna., Vi har inte någon lucka i DENSE_RANK-funktionen.
i följande skärmdump kan du se att Isabella har liknande nummer i de två ämnena. En rankfunktion tilldelar rank 1 för liknande värden men ignorerar internt rank två, och nästa rad blir rank tre.
i Dense_Rank-funktionen bibehåller den rangen och ger ingen lucka för värdena.
NTILE(N) SQL RANK function
vi använder funktionen NTILE(N) för att distribuera antalet rader i det angivna (N) antalet grupper., Varje rad grupp får sin rang enligt det angivna villkoret. Vi måste ange värdet för önskat antal grupper.
i mitt exempel har vi nio poster i Undersökningstabellen. NTILE (2) visar att vi behöver en grupp av två poster i resultatet.,
1
2
3
4
5
|
SELECT *,
NTILE(2) OVER(
ORDER BY Marks DESC) Rank
FROM ExamResult
ORDER BY rank;
|
In the output, we can see two groups. Group 1 contains five rows, and Group 2 contains four rows.,
på samma sätt delar NTILE(3) antalet rader med tre grupper med tre poster i varje grupp.,
1
2
3
4
5
|
SELECT *,
NTILE(3) OVER(
ORDER BY Marks DESC) Rank
FROM ExamResult
ORDER BY rank;
|
We can use SQL PARTITION BY clause to have more than one partition., I följande fråga är varje partition på ämnen uppdelad i två grupper.,
1
2
3
4
|
SELECT *,
NTILE(2) OVER(PARTITION BY subject ORDER BY Marks DESC) Rank
FROM ExamResult
ORDER BY subject, rank;
|
Practical usage of SQL RANK functions
We can use SQL RANK function to fetch specific rows from the data., Antag att vi vill få data från studenterna från LED 1 till 3. I följande fråga använder vi vanliga tabelluttryck(CTE) för att få data med row_number () – funktionen och filtrerade senare resultatet från CTE för att uppfylla vårt tillstånd.,d>
= 1 och rankas < =3
Vi kan använda kommandot offset Fetch med start från SQL Server 2012 för att hämta ett visst antal poster.,v id=”0fa57edc44″>
en snabb sammanfattning av SQL rank funktioner
row_number |
det tilldelar Sekventiell rank nummer till varje unik post., |
RANK |
det tilldelar ranknumret till varje rad i en partition. Det hoppar över numret för liknande värden. |
Dense_RANK |
det tilldelar ranknumret till varje rad i en partition. Det hoppar inte över numret för liknande värden. |
NTILE(N) |
det delar antalet rader enligt angiven partition och tilldelar unikt värde i partitionen., |
slutsats
i den här artikeln utforskade vi SQL RANK-funktioner och skillnad mellan dessa funktioner. Det är bra för sql-utvecklare att vara bekant med dessa funktioner för att utforska och hantera sina data väl. Om du har några kommentarer eller frågor, gärna lämna dem i kommentarerna nedan.,
- författare
- Senaste inlägg
han är skaparen av en av de största gratis online samlingar av artiklar om ett enda ämne, med sin 50-del serien på SQL Server alltid på tillgänglighet grupper. Baserat på hans bidrag till SQL Server-samhället har han blivit erkänd med olika utmärkelser, inklusive den prestigefyllda ”årets bästa författare” kontinuerligt i 2020 och 2021 på SQLShack.,
Raj är alltid intresserad av nya utmaningar så om du behöver konsulthjälp i något ämne som omfattas av hans skrifter, kan han nås på rajendra.gupta16@gmail.,com
Visa alla inlägg från Rajendra Gupta
- utföra mindre och större versionsuppgraderingar för AWS RDS SQL Server – Januari 29, 2021
- distribuera AWSQL RDS Postgres instances – Januari 27, 2021
- migrera dina lokala SQL-databaser till AWS RDS SQL Server med AWS DMS – 25 januari 2021