I SQL Server er NTILE()
funktionen giver dig mulighed for at fordele rækkerne i en ordnet partition i et bestemt antal grupper. Grupperne er nummererede, startende ved 1. For hver række, NTILE()
returnerer nummeret på den gruppe, som rækken tilhører.
Du angiver blot det antal grupper, du ønsker, når du kalder funktionen.
Syntaks
Syntaksen ser sådan ud:
NTILE (integer_expression) OVER ( [] )
heltalsudtryk er et positivt heltalsudtryk, der angiver antallet af grupper, som hver partition skal opdeles i. Det kan være af typen int eller bigt .
FROM
klausul i partitioner, som funktionen anvendes på.
NTILE()
værdier tildeles til rækkerne i en partition. Et heltal kan ikke repræsentere en kolonne, når
Eksempel 1 – Grundlæggende brug
Her er et grundlæggende eksempel, der viser, hvordan denne funktion fungerer:
VÆLG Spiller, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE'FRA Scoreboard;
Resultat:
+----------+--------+---------+| Spiller | Score | NTILE ||--------+---------+---------|| Bart | 2010 | 1 || Brænder | 1270 | 1 || Meg | 1030 | 2 || Marge | 990 | 2 || Lisa | 710 | 3 || Ned | 666 | 3 || Apu | 350 | 4 || Homer | 1 | 4 |+-----------+--------+---------+
I dette tilfælde er der 8 resultater og den værdi, jeg giver til NTILE()
er 4, så værdierne er jævnt fordelt på 4 grupper.
Eksempel 2 – Skift NTILE-værdien
Her er, hvad der sker, hvis jeg ændrer NTILE()
værdi til 3.
VÆLG Spiller, Score, NTILE(3) OVER (ORDER BY Score DESC) 'NTILE'FRA Scoreboard;
Resultat:
+----------+--------+---------+| Spiller | Score | NTILE ||--------+---------+---------|| Bart | 2010 | 1 || Brænder | 1270 | 1 || Meg | 1030 | 1 || Marge | 990 | 2 || Lisa | 710 | 2 || Ned | 666 | 2 || Apu | 350 | 3 || Homer | 1 | 3 |+-----------+--------+---------+
Resultaterne er fordelt på 3 grupper. Som du kunne forvente, ender den sidste gruppe med kun 2 rækker (sammenlignet med 3 for de andre grupper).
Eksempel 3 – Skift bestilling
Skift af rækkefølgen mellem stigende og faldende vil normalt resultere i NTILE()
værdier, der anvendes på forskellige rækker.
VÆLG Spiller, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FRA ScoreboardORDER BY Score DESC;
Resultat:
+-------------------------- ---------------+| Spiller | Score | NTILE Faldende | NTILE Stigende ||--------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 4 || Brænder | 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 |+-----------+---------+--------------------+----- --------------+
Dette vil dog afhænge af, hvor mange rækker der er i resultatsættet kontra antallet af NTILE'er. Det er klart, hvis NTILE()
værdien er 1, så er der ingen forskel.
VÆLG Spiller, Score, NTILE(1) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending'FRA ScoreboardORDER BY Score DESC;
Resultat:
+-------------------------- ---------------+| Spiller | Score | NTILE Faldende | NTILE Stigende ||--------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 1 || Brænder | 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 |+-----------+---------+--------------------+----- --------------+
Det samme vil ske, hvis resultatsættet kun indeholder én række, uanset NTILE()
værdi:
VÆLG Spiller, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FRA ScoreboardWHERE Score> 2000ORDER BY Score DESC;Resultat:
+-------------------------- ---------------+| Spiller | Score | NTILE Faldende | NTILE Stigende ||--------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 1 |+-----------+---------+--------------------+----- --------------+Eksempel 4 – Partitioner
Du kan bruge
PARTITION BY
klausul for at opdele resultaterne i partitioner. Når du gør dette,NTILE()
anvendes mod hver partition.Eksempel:
VÆLG Holdnavn, Spiller, Score, NTILE(2) OVER (OPDELING EFTER Holdnavn ORDEN EFTER Score ASC) 'NTILE'FRA Scoreboard SINNER JOIN Team tON t.TeamId =s.TeamId;Resultat:
+------------+-----------+--------+------------ -------+| Holdnavn | Spiller | Score | NTILE ||-------------------------------- ------|| Mongreler | Apu | 350 | 1 || Mongreler | Ned | 666 | 1 || Mongreler | Meg | 1030 | 2 || Mongreler | Brænder | 1270 | 2 || Simpsons | Homer | 1 | 1 || Simpsons | Lisa | 710 | 1 || Simpsons | Marge | 990 | 2 || Simpsons | Bart | 2010 | 2 |+--------------------------- ------+