用于更正数据的Sql脚本

问题描述 投票:1回答:4

我在表中有以下数据:

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

我想编写一个脚本,以下列方式为我提供数据校正

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

我们可以用SQL脚本吗?

有什么建议?

sql sql-server sql-scripts
4个回答
4
投票

使用row_number()

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

2
投票

试试这个:

    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
投票

如果要使用新的RevisionId将值更新回表,可以像下面这样使用CTE

;with cte as
(
 select *, row_number() over(partition by InventoryId order by id) as rn
 from @table 
)

 update cte set RevisionId = rn

0
投票

create table#temp1(A int,B int)

插入#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)

从#temp1中选择*,row_number()over(b by b order by b asc)

© www.soinside.com 2019 - 2024. All rights reserved.