Je lisais sur la fonction CLASSEMENT pour ms sql. Je comprends les autres fonctions sauf NTILE (). Disons que si j'ai ces données:
StudentID MARKS
S1 75
S2 83
S3 91
S4 83
S5 93
Donc si je fais une NTILE(2) OVER(ORDER BY MARKS desc)
quel sera le résultat et pourquoi?
Et si c'est une NTILE(3)
? Explication simple quelqu'un?
Considérez-le 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 inégal 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 de plus
insert #temp values('S6',92 )
Maintenant, les deux godets ont 3 rangées
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 compartiments
Il organisera les données par ordre décroissant de notes, puis les divisera en 2 groupes.
Si les données ne peuvent pas être divisées en groupes égaux, alors 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 de diffusion en compartiments pour les tests du 10/10/80. Par exemple, nous testons la ligne d'objet d'un e-mail et souhaitons envoyer l'une des deux options à 10% chacune de la liste, celle qui fonctionne mieux étant envoyée aux 80% restants.
SELECT [liste de champs], (NTILE (10) OVER (tri par newid ())) - 1 AS Segment FROM [data]
Le "order by newid ()" assure un ordre aléatoire. La syntaxe "[NTILE ...] - 1" est le résultat direct de certains des autres outils que nous utilisons pour l'analyse de texte au lieu de mathématiques entières, il était donc plus facile d'exécuter les résultats de 0 à 9 plutôt que de 1 à 10. . Le champ de 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.
Si vous avez besoin d'une requête avec des résultats réplicables, vous devrez utiliser quelque chose de déterministe dans la clause "order by", ou ajouter une colonne avec un GUID à utiliser pour la clause order by.
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 groupe prédéterminé, c'est-à-dire NTILE (10) OVER (PARTITION BY State ORDER BY newid ()) ou certains autres. Je crois que la clause ORDER BY est requise - la PARTITION BY est facultative.
Dans la fonction Ntile, il compte d'abord le nombre de lignes et le divise par le paramètre passé dans ntile, puis fait un groupe égal de lignes en fonction du quotient et les classe, puis les lignes restantes seront réparties par chaque groupe à partir du haut de manière variable. et ne le prendra pas dans les moindres rangées, par exemple si group1 a 4 rangées, alors il prendra la 5ème rangée dans son groupe et non la dernière rangée.
Merci
Ntile sans utiliser de clause de 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, par exemple: 1,1,1,2,3,4,5 ntile (3) donner 3,2,2. Comment ai-je obtenu 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 le nombre de lignes est égal, aucun problème. il suffit de diviser l'ensemble de données
Ntile utilisant la clause de partition, divisez simplement l'ensemble de données en fonction des valeurs de l'ensemble de données de sorte que: si aucun des lignes n'est égal à 7, les valeurs de ligne d'exemple sont: 1,1,1,2,3,4,5 alors: ntile (3) partitionné par valeur donnera: 1,2,3,1,1,1,1. Comment ai-je obtenu cela?. Brisez d'abord l'ensemble de données en fonction des valeurs: ici, 1,1,1 est une partition, ensuite toutes les valeurs forment une partition différente. Commencez ensuite à attribuer le rang ntile à chaque partition. Ici, 1,1,1 deviendra 1,2,3, puis passez à la partition suivante, vous ne pouvez extraire le rang que jusqu'au nombre spécifié dans la fonction ntile ()