Grouper les lignes en sets de 5

TableA

Col1 ---------- 1 2 3 4....all the way to 27 

Je veux append une deuxième colonne qui assigne un nombre à des groupes de 5.

Résultats

 Col1 Col2 ----- ------ 1 1 2 1 3 1 4 1 5 1 6 2 7 2 8 2...and so on 

Le 6ème groupe devrait avoir 2 rangées dedans.

NTILE n'accomplit pas ce que je veux à cause de la façon dont NTILE gère les groupes s'ils ne sont pas divisibles par l'entier.

Si le nombre de lignes dans une partition n'est pas divisible par l'expression_entier, cela entraînera des groupes de deux tailles qui diffèrent d'un membre. Les groupes plus importants viennent avant les groupes plus petits dans l'ordre spécifié par la clause OVER. Par exemple, si le nombre total de lignes est 53 et le nombre de groupes est cinq, les trois premiers groupes auront 11 lignes et les deux groupes restants auront 10 lignes chacun. Si, par contre, le nombre total de lignes est divisible par le nombre de groupes, les rangées seront réparties uniformément parmi les groupes. Par exemple, si le nombre total de lignes est de 50 et qu'il y a cinq groupes, chaque compartiment contiendra 10 lignes.

Ceci est clairement démontré dans ce violon SQL . Les groupes 4, 5, 6 ont chacun 4 rangées alors que les autres en ont 5. J'ai commencé à find des solutions, mais elles devenaient longues et j'ai l'printing que quelque chose me manque et que cela pourrait se faire en une seule ligne.

Vous pouvez utiliser ceci:

 ;WITH CTE AS ( SELECT col1, RN = ROW_NUMBER() OVER(ORDER BY col1) FROM TableA ) SELECT col1, (RN-1)/5+1 col2 FROM CTE; 

Dans vos données d'exemple, col1 est un corrélatif sans lacunes, donc vous pouvez l'utiliser directement (si c'est un INT ) sans utiliser ROW_NUMBER() . Mais dans le cas contraire, cette réponse fonctionne aussi. Voici le sqlfiddle modifié.

Un peu de maths peut faire beaucoup de path. soustraire 1 de toutes les valeurs place les 5s (cas de bords) dans le groupe précédent ici, et 6 dans le suivant. plancher la division par la taille de votre groupe et en ajoutant un donner le résultat que vous searchz. En outre, l'exemple SQLFiddle corrige ici votre insertion itérative – la table n'atteint que 27.

 SELECT col1, floor((col1-1)/5)+1 as grpNum FROM tableA