sql >> Databasteknik >  >> RDS >> Sqlserver

Hur NTILE() fungerar i SQL Server

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 .

är valfritt. Den delar resultatuppsättningen som produceras av FROM sats i partitioner som funktionen tillämpas på.

krävs. Det bestämmer i vilken ordning NTILE() värden tilldelas raderna i en partition. Ett heltal kan inte representera en kolumn när används i en rankningsfunktion.

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 |+------------+-----------+--------+---------------- ------+

  1. SQL FLOAT:3 poäng som hjälper dig att undvika konstiga matematiska fel

  2. Vanligt tabelluttryck, varför semikolon?

  3. När körs SQLiteOpenHelper onCreate() / onUpgrade()?

  4. UUID eller SEQUENCE för primärnyckel?