SQL скрипт для исправления данных - PullRequest
1 голос
/ 28 марта 2019

У меня есть следующие данные в таблице:

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?

Есть предложения?

Ответы [ 4 ]

4 голосов
/ 28 марта 2019

использование row_number()

select *, row_number() over(partition by InventoryId order by id) as newRevisionId
from tablename 
2 голосов
/ 28 марта 2019

Если вы хотите обновить значения обратно в таблицу с новым RevisionId, вы можете использовать CTE, как показано ниже.

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

 update cte set RevisionId = rn
2 голосов
/ 28 марта 2019

Попробуйте это:

    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
0 голосов
/ 28 марта 2019

создать таблицу # 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)

select *, row_number () over (разбиение на порядок b на b asc) из # temp1

...