1
votes

Script SQL pour corriger les données

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?


0 commentaires

4 Réponses :


4
votes

utilisez row_number()

select *, row_number() over(partition by InventoryId order by id) as newRevisionId
from tablename 


3 commentaires

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.



2
votes

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


2 commentaires

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



2
votes

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


0 commentaires

0
votes

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


0 commentaires