web-dev-qa-db-fra.com

Vous voulez en savoir plus sur NTILE ()

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?

37
10e5x

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

40
SQLMenace

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  
18
Aditi

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.

7
nick

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

0
sam

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

0
Sagar Byali