Dans SQL Server, le NTILE()
La fonction vous permet de répartir les lignes d'une partition ordonnée en un nombre spécifié de groupes. Les groupes sont numérotés à partir de 1. Pour chaque ligne, NTILE()
renvoie le numéro du groupe auquel appartient la ligne.
Vous fournissez simplement le nombre de groupes que vous désirez lors de l'appel de la fonction.
Syntaxe
La syntaxe ressemble à ceci :
NTILE (integer_expression) OVER ( [] )
expression_entier est une expression entière positive qui spécifie le nombre de groupes dans lesquels chaque partition doit être divisée. Il peut être de type int , ou bigint .
FROM
clause en partitions auxquelles la fonction est appliquée.
NTILE()
les valeurs sont affectées aux lignes d'une partition. Un entier ne peut pas représenter une colonne lorsque la
Exemple 1 - Utilisation de base
Voici un exemple de base montrant comment cette fonction fonctionne :
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE'FROM Scoreboard ;
Résultat :
+----------+---------+---------+| Joueur | Note | NTILE ||----------+---------+---------|| Bart | 2010 | 1 || Brûlures | 1270 | 1 || Meg | 1030 | 2 || Marge | 990 | 2 || Lisa | 710 | 3 || Ned | 666 | 3 || Apu | 350 | 4 || Homère | 1 | 4 |+----------+---------+---------+
Dans ce cas, il y a 8 résultats et la valeur que je fournis à NTILE()
est de 4, de sorte que les valeurs sont uniformément réparties sur 4 groupes.
Exemple 2 - Modifier la valeur NTILE
Voici ce qui se passe si je change le NTILE()
valeur à 3.
SELECT Player, Score, NTILE(3) OVER (ORDER BY Score DESC) 'NTILE'FROM Scoreboard ;
Résultat :
+----------+---------+---------+| Joueur | Note | NTILE ||----------+---------+---------|| Bart | 2010 | 1 || Brûlures | 1270 | 1 || Meg | 1030 | 1 || Marge | 990 | 2 || Lisa | 710 | 2 || Ned | 666 | 2 || Apu | 350 | 3 || Homère | 1 | 3 |+----------+---------+---------+
Les résultats sont répartis en 3 groupes. Comme vous vous en doutez, le dernier groupe se retrouve avec seulement 2 lignes (contre 3 pour les autres groupes).
Exemple 3 - Changer l'ordre
Basculer l'ordre entre croissant et décroissant se traduira généralement par le NTILE()
valeurs appliquées à différentes lignes.
SELECT Joueur, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardORDER BY Score DESC ;
Résultat :
+----------+---------+--------------------+---- ---------------+| Joueur | Note | NTILE Descendant | NTILE Croissant ||----------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 4 || Brûlures | 1270 | 1 | 4 || Meg | 1030 | 2 | 3 || Marge | 990 | 2 | 3 || Lisa | 710 | 3 | 2 || Ned | 666 | 3 | 2 || Apu | 350 | 4 | 1 || Homère | 1 | 4 | 1 |+----------+---------+--------------------+----- --------------+
Cependant, cela dépendra du nombre de lignes dans le jeu de résultats par rapport au nombre de NTILE. Évidemment, si le NTILE()
la valeur est 1, alors il n'y aura pas de différence.
SELECT Joueur, Score, NTILE(1) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardORDER BY Score DESC ;
Résultat :
+----------+---------+--------------------+---- ---------------+| Joueur | Note | NTILE Descendant | NTILE Croissant ||----------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 1 || Brûlures | 1270 | 1 | 1 || Meg | 1030 | 1 | 1 || Marge | 990 | 1 | 1 || Lisa | 710 | 1 | 1 || Ned | 666 | 1 | 1 || Apu | 350 | 1 | 1 || Homère | 1 | 1 | 1 |+----------+---------+--------------------+----- --------------+
La même chose se produira si le jeu de résultats ne contient qu'une seule ligne, quel que soit le NTILE()
valeur :
SELECT Joueur, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardWHERE Score> 2000ORDER BY Score DESC;Résultat :
+----------+---------+--------------------+---- ---------------+| Joueur | Note | NTILE Descendant | NTILE Croissant ||----------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 1 |+----------+---------+--------------------+----- --------------+Exemple 4 – Partitions
Vous pouvez utiliser le
PARTITION BY
clause pour diviser les résultats en partitions. Lorsque vous faites cela,NTILE()
est appliqué à chaque partition.Exemple :
SELECT TeamName, Player, Score, NTILE(2) OVER (PARTITION BY TeamName ORDER BY Score ASC) 'NTILE'FROM Scoreboard sINNER JOIN Team tON t.TeamId =s.TeamId ;Résultat :
+------------+----------+---------+------------ -------+| NomÉquipe | Joueur | Note | NTILE ||------------+----------+---------+------------- ------|| Bâtards | Apu | 350 | 1 || Bâtards | Ned | 666 | 1 || Bâtards | Meg | 1030 | 2 || Bâtards | Brûlures | 1270 | 2 || Simpsons | Homère | 1 | 1 || Simpsons | Lisa | 710 | 1 || Simpsons | Marge | 990 | 2 || Simpsons | Bart | 2010 | 2 |+------------+----------+---------+------------- ------+