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?
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
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
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.
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
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 ()