I SQL Server, NTILE()
funktionen låter dig fördela raderna i en ordnad partition i ett specificerat antal grupper. Grupperna är numrerade, med början på 1. För varje rad, NTILE()
returnerar numret på gruppen som raden tillhör.
Du anger helt enkelt antalet grupper du önskar när du anropar funktionen.
Syntax
Syntaxen ser ut så här:
NTILE (integer_expression) OVER ( [] )
heltalsuttryck är ett positivt heltalsuttryck som anger antalet grupper som varje partition måste delas in i. Det kan vara av typen int , eller bigt .
FROM
sats i partitioner som funktionen tillämpas på.
NTILE()
värden tilldelas raderna i en partition. Ett heltal kan inte representera en kolumn när
Exempel 1 – Grundläggande användning
Här är ett grundläggande exempel som visar hur den här funktionen fungerar:
VÄLJ spelare, poäng, NTILE(4) ÖVER (ORDER BY Score DESC) 'NTILE'FRÅN resultattavlan;
Resultat:
+----------+--------+---------+| Spelare | Betyg | NTILE ||--------+---------+---------|| Bart | 2010 | 1 || Brännskador | 1270 | 1 || Meg | 1030 | 2 || Marge | 990 | 2 || Lisa | 710 | 3 || Ned | 666 | 3 || Apu | 350 | 4 || Homer | 1 | 4 |+----------+---------+--------+
I det här fallet finns det 8 resultat och värdet jag ger till NTILE()
är 4, så värdena är jämnt fördelade över 4 grupper.
Exempel 2 – Ändra NTILE-värdet
Det här är vad som händer om jag ändrar NTILE()
värde till 3.
VÄLJ spelare, poäng, NTILE(3) ÖVER (ORDER BY Score DESC) 'NTILE'FRÅN resultattavlan;
Resultat:
+----------+--------+---------+| Spelare | Betyg | NTILE ||--------+---------+---------|| Bart | 2010 | 1 || Brännskador | 1270 | 1 || Meg | 1030 | 1 || Marge | 990 | 2 || Lisa | 710 | 2 || Ned | 666 | 2 || Apu | 350 | 3 || Homer | 1 | 3 |+----------+--------+---------+
Resultaten är fördelade på 3 grupper. Som du kan förvänta dig, slutar den sista gruppen med endast 2 rader (jämfört med 3 för de andra grupperna).
Exempel 3 – Byt beställning
Att byta ordning mellan stigande och fallande resulterar vanligtvis i NTILE()
värden som tillämpas på olika rader.
VÄLJ spelare, poäng, NTILE(4) ÖVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardORDER BY Score DESC;
Resultat:
+----------+---------+--------------------+---- ---------------+| Spelare | Betyg | NTILE Fallande | NTILE Stigande ||--------+---------+--------------------------+---- ---------------|| Bart | 2010 | 1 | 4 || Brännskador | 1270 | 1 | 4 || Meg | 1030 | 2 | 3 || Marge | 990 | 2 | 3 || Lisa | 710 | 3 | 2 || Ned | 666 | 3 | 2 || Apu | 350 | 4 | 1 || Homer | 1 | 4 | 1 |+----------+---------+--------------------+----- --------------+
Detta kommer dock att bero på hur många rader som finns i resultatuppsättningen kontra antalet NTILE. Uppenbarligen, om NTILE()
värdet är 1, då blir det ingen skillnad.
VÄLJ spelare, poäng, NTILE(1) ÖVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardORDER BY Score DESC;
Resultat:
+----------+---------+--------------------+---- ---------------+| Spelare | Betyg | NTILE Fallande | NTILE Stigande ||--------+---------+--------------------------+---- ---------------|| Bart | 2010 | 1 | 1 || Brännskador | 1270 | 1 | 1 || Meg | 1030 | 1 | 1 || Marge | 990 | 1 | 1 || Lisa | 710 | 1 | 1 || Ned | 666 | 1 | 1 || Apu | 350 | 1 | 1 || Homer | 1 | 1 | 1 |+----------+---------+--------------------+----- --------------+
Samma sak kommer att hända om resultatuppsättningen bara innehåller en rad, oavsett NTILE()
värde:
VÄLJ spelare, poäng, NTILE(4) ÖVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardWHERE Score> 2000ORDER BY Score DESC;Resultat:
+----------+---------+--------------------+---- ---------------+| Spelare | Betyg | NTILE Fallande | NTILE Stigande ||--------+---------+--------------------------+---- ---------------|| Bart | 2010 | 1 | 1 |+----------+---------+--------------------+----- --------------+Exempel 4 – Partitioner
Du kan använda
PARTITION BY
klausul för att dela upp resultaten i partitioner. När du gör detta,NTILE()
tillämpas mot varje partition.Exempel:
VÄLJ TeamName, Player, Score, NTILE(2) OVER (PARTITION BY TeamName ORDER BY Score ASC) 'NTILE'FROM Scoreboard SINNER JOIN Team tON t.TeamId =s.TeamId;Resultat:
+------------+-----------+--------+---------------- -------+| Lagnamn | Spelare | Betyg | NTILE ||---------------------------------- ------|| Blandare | Apu | 350 | 1 || Blandare | Ned | 666 | 1 || Blandare | Meg | 1030 | 2 || Blandare | Brännskador | 1270 | 2 || Simpsons | Homer | 1 | 1 || Simpsons | Lisa | 710 | 1 || Simpsons | Marge | 990 | 2 || Simpsons | Bart | 2010 | 2 |+------------+-----------+--------+---------------- ------+