J'ai les données suivantes dans une table:
Id | InventoryId | RevisionId --------------------------------- 1001 | 1234 | 1 1002 | 2235 | 1 1003 | 2235 | 2 1004 | 2235 | 3 1005 | 2235 | 4 1006 | 2235 | 5 1007 | 3234 | 1 1008 | 3234 | 2 1009 | 3234 | 3 1010 | 3234 | 4 1011 | 3234 | 5 1012 | 3234 | 6 1013 | 3234 | 7 1014 | 3234 | 8
Je veux écrire un script qui me fournisse la correction des données de la manière suivante
Id | InventoryId | RevisionId ----------------------------------- 1001 | 1234 | 1 1002 | 2235 | 1 1003 | 2235 | 2 1004 | 2235 | 2 1005 | 2235 | 3 1006 | 2235 | 4 1007 | 3234 | 1 1008 | 3234 | 2 1009 | 3234 | 3 1010 | 3234 | 3 1011 | 3234 | 4 1012 | 3234 | 5 1013 | 3234 | 5 1014 | 3234 | 6
Pouvons-nous faire cela avec un script SQL?
Des suggestions?
4 Réponses :
utilisez row_number()
select *, row_number() over(partition by InventoryId order by id) as newRevisionId from tablename
exactement la même réponse que j'allais publier et j'ai vu cela.
@AjanBalakumaran, vous pouvez toujours le poster, ajoutez simplement quelques explications pour qu'il devienne unique :)
Je vote pour le motif (peut-être pas l'intention de l'auteur) que l'OP ne voudra peut-être même pas faire une mise à jour, mais plutôt simplement générer cette séquence quand il en a besoin.
Essayez ceci:
DECLARE @Table TABLE(Id INT,InventoryId INT,RevisionId INT) INSERT INTO @Table SELECT 1001,1234,1 UNION ALL SELECT 1002,2235,1 UNION ALL SELECT 1003,2235,2 UNION ALL SELECT 1004,2235,2 UNION ALL SELECT 1005,2235,3 UNION ALL SELECT 1006,2235,4 UNION ALL SELECT 1007,3234,1 UNION ALL SELECT 1008,3234,2 UNION ALL SELECT 1009,3234,3 UNION ALL SELECT 1010,3234,3 UNION ALL SELECT 1011,3234,4 UNION ALL SELECT 1012,3234,5 UNION ALL SELECT 1013,3234,5 UNION ALL SELECT 1014,3234,6 ;WITH cte AS( SELECT Id,InventoryId,RevisionId, ROW_NUMBER() OVER(PARTITION BY InventoryId ORDER BY id) AS NewRevision FROM @Table ) UPDATE cte SET RevisionId=newRevision SELECT * FROM @Table
pouvons-nous mettre à jour uniquement les enregistrements dans lesquels revisionId est dupliqué au lieu de mettre à jour tous les revisionId
inclure "where RevisionId <> newRevision" comme clause where dans l'instruction de mise à jour
Si vous souhaitez mettre à jour les valeurs dans la table avec le nouvel ID de révision, vous pouvez utiliser CTE
comme suit.
;with cte as ( select *, row_number() over(partition by InventoryId order by id) as rn from @table ) update cte set RevisionId = rn
créer la table # temp1 (A int, B int)
insérer dans les valeurs # temp1 (a, b) (1001, 1234) , (1002,2235) , (1003,2235) , (1004,2235) , (1005,2235) , (1006,2235) , (1007,3234) , (1008,3234) , (1009,3234) , (1010,3234) , (1011,3234) , (1012,3234) , (1013,3234) , (1014,3234)
select *, row_number () over (partition by b order by b asc) from # temp1