T-SQL pour corriger datatables en double dans la table

Le tableau ci-dessous représente un set de données propre. Notez que pour chaque élément, la valeur Priority est un entier unique compris entre 1 et le nombre d'occurrences de cet élément:

ItemKey ItemName Priority 1 Item1 1 2 Item1 2 3 Item1 3 4 Item2 1 5 Item3 1 6 Item3 2 7 Item4 1 8 Item4 2 

Malheureusement, il y a un bug dans notre application qui a entraîné des priorités en double pour certains éléments. Par exemple, dans le tableau suivant, Item1 et Item4 ont tous deux des priorités en double.

 ItemKey ItemName Priority 1 Item1 1 2 Item1 1 3 Item1 2 4 Item2 1 5 Item3 1 6 Item3 2 7 Item4 1 8 Item4 1 

J'apprécierais quelques conseils sur la façon d'écrire un script T-SQL pour nettoyer datatables ci-dessus. Le script doit déterminer les éléments qui ont des priorités en double et met à jour les priorités pour les éléments incriminés afin qu'ils soient uniques pour cet élément et aient une valeur comprise entre 1 et le nombre d'occurrences de l'élément. Après le nettoyage des données, le nombre de lignes doit restr inchangé.

J'ai seulement de l'expérience avec PL / SQL donc je ne suis pas certain de la meilleure approche pour l'implémenter avec T-SQL.

Merci de votre aide.

Avec la fonction de window:

 ;with cte as( select *, row_number() over(partition by ItemName order by ItemKey) as rn from Table) update cte set Priority = rn 

Dans votre exemple particulier, la priorité est directement liée à ItemKey . Si ce n'est pas le cas, une approche plus générale est:

 with toupdate as ( select t.*, row_number() over (partition by ItemName order by Priority, ItemKey ) as new_priority from table t ) update toupdate set priority = newpriority where priority <> newpriority;