Vous voulez en savoir plus sur NTILE()

Je lisais sur la fonction de classement pour ms sql. Je comprends les autres fonctions sauf NTILE (). Disons si j'ai ces données:

   StudentID     MARKS  
      S1           75  
      S2           83
      S3           91
      S4           83
      S5           93  

Donc, si je fais un NTILE(2) OVER(ORDER BY MARKS desc) quel sera le résultat, et pourquoi?
Et si c'est un NTILE(3)? Simple explication quelqu'un?

33
demandé sur Rahul Singh 2013-01-16 13:43:10

5 réponses

Pensez-y comme des seaux, NTILE (2) fera 2 seaux, la moitié des lignes aura la valeur 1 et l'autre moitié la valeur 2

Exemple

create table  #temp(StudentID char(2),    Marks  int) 
insert #temp  values('S1',75 ) 
insert #temp  values('S2',83)
insert #temp  values('S3',91)
insert #temp  values('S4',83)
insert #temp  values('S5',93 ) 


select NTILE(2) over(order by Marks),*
from #temp
order by Marks

Voici la sortie, puisque vous avez un nombre impair de lignes, le compartiment 1 aura 1 ligne de plus

1   S1  75
1   S2  83
1   S4  83
2   S3  91
2   S5  93

Si vous ajoutez une ligne supplémentaire

insert #temp  values('S6',92 ) 

Maintenant, les deux seaux ont 3 lignes

1   S1  75
1   S2  83
1   S4  83
2   S3  91
2   S6  92
2   S5  93

En réalité, je n'ai jamais utilisé NTILE dans le code de production, mais je peux voir l'utilisation où vous devez diviser les résultats en n nombre de seaux

37
répondu SQLMenace 2013-01-16 09:51:23

Il va organiser les données dans l'ordre décroissant des marques, puis les diviser en 2 groupes.

Si les données ne peuvent pas être divisées en groupes égaux, les premiers groupes auront plus de lignes que les derniers groupes.

Donc NTILE (2) vous donnera

StudentID       MARKS       NTILE  
      S5           93           1 
      S3           91           1 
      S2           83           1
      S4           83           2
      S1           75           2 

De même NTILE (3) vous donnera

StudentID       MARKS       NTILE  
      S5           93           1 
      S3           91           1 
      S2           83           2
      S4           83           2
      S1           75           3  
17
répondu Aditi 2013-01-16 09:54:42

J'utilise NTILE assez fréquemment pour diviser les listes d'email en seaux pour les tests 10/10/80. Par exemple, nous testons une ligne d'objet d'un e-mail, et nous voulons envoyer l'une des deux options à 10% chacune de la liste, celle qui fonctionne le mieux étant envoyée aux 80% restants.

Sélectionnez [Liste des champs], (NTILE(10) OVER (order by newid ())) -1 comme Segment de [data]

Le "order by newid ()" assure un ordre aléatoire. Le " [NTILE ...] -1 " la syntaxe est le résultat direct d'une partie de l'autre outils que nous utilisons faire l'analyse de texte au lieu de mathématiques entières, il était donc plus facile d'avoir les résultats exécutés à partir de 0-9 plutôt que 1-10. Le champ segment sera rempli avec une valeur de 0-9 que je peux utiliser pour séparer 10% des enregistrements assez facilement, et plus d'une fois pour les campagnes avec plusieurs efforts pour eux.

Si vous avez besoin d'une requête avec des résultats réplicables, vous devez utiliser quelque chose de déterministe dans la clause "order by", ou ajouter une colonne avec un GUID à utiliser pour la clause order by clause.

La clause PARTITION BY serait utilisée pour créer des groupes de compartiments basés sur l'état, ou la profession, ou un autre groupement prédéterminé, c'est-à-dire NTILE(10) OVER (PARTITION BY State ORDER BY newid()) ou un tel. Je crois que la clause ORDER BY est requise - la PARTITION BY est facultative.

5
répondu nick 2013-12-09 16:12:23

Dans la fonction Ntile d'abord, il compte le nombre de lignes et le divise par le paramenter passé dans ntile, puis fait un groupe égal de lignes en fonction du quotient et les classe, puis les lignes restantes seront distribuées par chaque groupe à partir du haut de manière changeante et ne le prendront pas des moindres lignes par exemple si group1 a 4 lignes alors il prendra la 5ème rangée dans son groupe pas la dernière rangée.

Merci

0
répondu sam 2015-02-12 08:44:09

Ntile sans utiliser la clause partition, divisez simplement l'ensemble de données en fonction du nombre dans le ntile(nombre) de telle sorte que : si aucune des lignes n'est 7, exemple: 1,1,1,2,3,4,5 ntile (3) donnera 3,2,2. Comment ai - je eu 3,2,2?. Supposons d'abord 7 comme 6 (un de moins pour le rendre Pair), 6/3 donne 2,2,2, puis ajoutez +! à la première partition. Si les pas de.des lignes sont même alors, pas de problème. divisez simplement l'ensemble de données

Ntile en utilisant la clause partition, divisez simplement l'ensemble de données en fonction des valeurs de l'ensemble de données telles que: si non des lignes sont 7, les valeurs de ligne D'exemple sont: 1,1,1,2,3,4,5 puis: ntile (3) partitionné par la valeur donnera: 1,2,3,1,1,1,1. Comment ai-je l'obtenir?. Premièrement, cassez l'ensemble de données en fonction des valeurs: ici, 1,1,1 est un partiton, ensuite toutes les valeurs forment une partition différente. Ensuite, commencez à attribuer un rang ntile à chaque partition. Ici, 1,1,1 deviendra 1,2,3 puis continuer avec la partition suivante, vous pouvez tirer le rang seulement jusqu'au nombre spécifié dans la fonction ntile ()

0
répondu Sagar Byali 2015-04-09 07:25:06