Regroupement des loggings – NOMBRE DE RANG et PARTITION PAR

S'il vous plaît voir le DDL ci-dessous:

create table #Test (ID int identity not null, name varchar(100), primary key (id)) insert into #Test (name) values ('Ian') insert into #Test (name) values ('Ian') insert into #Test (name) values ('Ian') insert into #Test (name) values ('Mark') insert into #Test (name) values ('James') insert into #Test (name) values ('James') insert into #Test (name) values ('Henry') 

Je cherche la sortie ci-dessous:

 Ian 1 Ian 1 Ian 1 Mark 2 James 3 James 3 Henry 4 

Tous les Ians ont le même nombre. Tous les James ont le même nombre. J'ai expérimenté avec ROW NUMBER et PARTITION BY mais j'ai échoué jusqu'ici.

Vous pouvez le faire de plusieurs façons, mais row_number() soi n'en fait pas partie.

Voici une méthode:

 select t.name, dense_rank() over (order by nameid) from (select t.*, min(id) over (partition by name) as nameid from #test t ) t; 

Cela calcule l'ID min pour chaque nom et l'utilise ensuite pour dense_rank() .

Si vous ne vous souciez pas de l'ordre particulier, vous pouvez utiliser dense_rank() sur le nom:

 select name, dense_rank() over (order by name) from #test t; 

Utilisez plutôt DENSE_RANK .

 Select Name, DENSE_RANK() Over (Order By Name) From #Test 

Vous pouvez get la sortie désirée avec:

 with prep as ( select name , DENSE_RANK() over (order by c) [rank] from ( select distinct name, min(id) c from #Test group by name ) a ) select T.name , prep.[rank] from #Test T inner join prep on prep.name = T.name 

La première (sous) requête sélectionne l'ID le plus bas possible par logging, DENSE_RANK s'assure ensuite que la numérotation est séquentielle et la requête finale utilise ces résultats préparés par rapport à la table #Test d'origine pour dupliquer datatables par ligne.

Vous pouvez en savoir plus sur les fonctions de classment ici: https://msdn.microsoft.com/fr-fr/library/ms189798.aspx