Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fonctionnement de NTILE() dans SQL Server

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 .

est facultatif. Il divise le jeu de résultats produit par le FROM clause en partitions auxquelles la fonction est appliquée.

est requis. Il détermine l'ordre dans lequel le NTILE() les valeurs sont affectées aux lignes d'une partition. Un entier ne peut pas représenter une colonne lorsque la est utilisé dans une fonction de classement.

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