Comment append un numéro de séquence pour les groupes (nouveau numéro si le même groupe se reproduit) dans une requête SQL

J'ai une question assez similaire à Comment append un numéro de séquence pour des groupes dans une requête SQL sans tables temporaires

Pour prendre l'échantillon à partir de là, j'ai une structure de données qui comprend les deux premières colonnes de cette table, et je veux générer la troisième colonne dans ma requête:

 Record Group GroupSequence
 ------- | --------- | --------------
 1 poulets 1
 2 poulets 1
 3 chevaux 2
 4 vaches 3
 5 chevaux 4
 6 chevaux 4

La différence avec la requête citée est que j'ai besoin d'un nouveau nombre si la ligne précédente n'avait pas la même valeur dans la deuxième colonne.

J'ai essayé d'append un numéro de ligne et d'utiliser LAG() pour vérifier si la ligne précédente avait la même valeur – si oui, prenez la valeur précédente de cette colonne générée, sinon, prenez le numéro de ligne – mais il semble que vous pouvez Ne réutilisez pas la colonne que vous construisez.

La valeur doit juste être un nombre différent – peu importe si c'est en ordre. Ce serait aussi bien:

 Record Group GroupSequence
 ------- | --------- | --------------
 1 poulets 1
 2 poulets 1
 3 chevaux 3
 4 vaches 4
 5 chevaux 5
 6 chevaux 5

Je pense que c'est ce dont vous avez besoin:

 WITH Src AS ( SELECT * FROM (VALUES (1, 'Chickens'), (2, 'Chickens'), (3, 'Horses '), (4, 'Cows '), (5, 'Horses '), (6, 'Horses '))T(Record, [Group]) ), Differentiator AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY Record) - RANK() OVER (PARTITION BY [Group] ORDER BY Record) Diff FROM Src ) SELECT Record, [Group], DENSE_RANK() OVER (ORDER BY [Group],Diff) NewGroup FROM Differentiator ORDER BY Record 

Il produit le tableau suivant:

 Record Group NewGroup ------ ----- -------- 1 Chickens 1 2 Chickens 1 3 Horses 3 4 Cows 2 5 Horses 4 6 Horses 4 

Brève explication:

La key consiste à calculer les positions relatives des loggings dans le tableau entier et dans chaque groupe [Groupe]. Si les loggings sont adjacents, le nombre global augmente de 1 et le nombre local est augmenté de 1. Ainsi, ROW_NUMBER() - RANK() est le même pour tous les loggings. S'il y a un écart, il y a aussi une distorsion dans la numérotation globale. Cela conduit à des nombres différents générés par ROW_NUMBER() - RANK() dans des groupes séparés.