In SQL Server, de NTILE()
functie stelt u in staat om de rijen in een geordende partitie in een gespecificeerd aantal groepen te verdelen. De groepen zijn genummerd, beginnend bij 1. Voor elke rij, NTILE()
geeft het nummer van de groep waartoe de rij behoort.
U geeft eenvoudig het aantal gewenste groepen op wanneer u de functie aanroept.
Syntaxis
De syntaxis gaat als volgt:
NTILE (integer_expression) OVER ( [] < order_by_clause > )
integer_expression is een positieve integer-expressie die het aantal groepen specificeert waarin elke partitie moet worden verdeeld. Het kan van het type int . zijn , of groot .
FROM
clausule in partities waarop de functie wordt toegepast.
NTILE()
waarden worden toegewezen aan de rijen in een partitie. Een geheel getal kan geen kolom vertegenwoordigen wanneer de
Voorbeeld 1 – Basisgebruik
Hier is een eenvoudig voorbeeld dat laat zien hoe deze functie werkt:
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE' FROM Scoreboard;
Resultaat:
+----------+---------+---------+ | Player | Score | NTILE | |----------+---------+---------| | Bart | 2010 | 1 | | Burns | 1270 | 1 | | Meg | 1030 | 2 | | Marge | 990 | 2 | | Lisa | 710 | 3 | | Ned | 666 | 3 | | Apu | 350 | 4 | | Homer | 1 | 4 | +----------+---------+---------+
In dit geval zijn er 8 resultaten en de waarde die ik geef aan NTILE()
is 4, dus de waarden zijn gelijkmatig verdeeld over 4 groepen.
Voorbeeld 2 – Verander de NTILE-waarde
Dit is wat er gebeurt als ik de NTILE()
. verander waarde tot 3.
SELECT Player, Score, NTILE(3) OVER (ORDER BY Score DESC) 'NTILE' FROM Scoreboard;
Resultaat:
+----------+---------+---------+ | Player | Score | NTILE | |----------+---------+---------| | Bart | 2010 | 1 | | Burns | 1270 | 1 | | Meg | 1030 | 1 | | Marge | 990 | 2 | | Lisa | 710 | 2 | | Ned | 666 | 2 | | Apu | 350 | 3 | | Homer | 1 | 3 | +----------+---------+---------+
De resultaten zijn verdeeld over 3 groepen. Zoals je zou verwachten, eindigt de laatste groep met slechts 2 rijen (vergeleken met 3 voor de andere groepen).
Voorbeeld 3 – Verander de volgorde
Het wisselen van volgorde tussen oplopend en aflopend resulteert meestal in de NTILE()
waarden worden toegepast op verschillende rijen.
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard ORDER BY Score DESC;
Resultaat:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 4 | | Burns | 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 | +----------+---------+--------------------+-------------------+
Dit hangt echter af van het aantal rijen in de resultatenset versus het aantal NTILE's. Het is duidelijk dat als de NTILE()
waarde 1 is, dan is er geen verschil.
SELECT Player, Score, NTILE(1) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard ORDER BY Score DESC;
Resultaat:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 1 | | Burns | 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 | +----------+---------+--------------------+-------------------+
Hetzelfde zal gebeuren als de resultatenset slechts één rij bevat, ongeacht de NTILE()
waarde:
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard WHERE Score > 2000 ORDER BY Score DESC;
Resultaat:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 1 | +----------+---------+--------------------+-------------------+
Voorbeeld 4 – Partities
U kunt de PARTITION BY
. gebruiken clausule om de resultaten in partities te verdelen. Wanneer u dit doet, NTILE()
wordt toegepast op elke partitie.
Voorbeeld:
SELECT TeamName, Player, Score, NTILE(2) OVER (PARTITION BY TeamName ORDER BY Score ASC) 'NTILE' FROM Scoreboard s INNER JOIN Team t ON t.TeamId = s.TeamId;
Resultaat:
+------------+----------+---------+-------------------+ | TeamName | Player | Score | NTILE | |------------+----------+---------+-------------------| | Mongrels | Apu | 350 | 1 | | Mongrels | Ned | 666 | 1 | | Mongrels | Meg | 1030 | 2 | | Mongrels | Burns | 1270 | 2 | | Simpsons | Homer | 1 | 1 | | Simpsons | Lisa | 710 | 1 | | Simpsons | Marge | 990 | 2 | | Simpsons | Bart | 2010 | 2 | +------------+----------+---------+-------------------+