2015-05-14 4 views
2

Я пытаюсь выполнить запрос для обновления текущей базы данных, но я не могу понять, как это сделать. Я пытаюсь с курсорами, но я не могу найти способ изолировать каждую строку и не устанавливать все строки отдельного столбца в одно и то же значение.Как перебирать столбец int для каждого отдельного значения в SQL?

Вот что я имею в моей базе данных:

RecoNumber Item 
ABIBAQC-01 1 
ABIBAQC-01 1 
ABIBAQC-01 1 
ABIBAQC-02 1 
ABIBAQC-03 1 
ABIBAQC-03 1 

И я хотел бы, чтобы он стал:

RecoNumber Item 
ABIBAQC-01 1 
ABIBAQC-01 2 
ABIBAQC-01 3 
ABIBAQC-02 1 
ABIBAQC-03 1 
ABIBAQC-03 2 

Как я уже сказал, я попытался с помощью курсора, но мне не хватает что-то, чтобы заставить его работать правильно.

DECLARE @NUMBER INT 
DECLARE @RECO NVARCHAR(10) 
DECLARE @RECO_OLD NVARCHAR(10) 

DECLARE db_cursor CURSOR FOR 
SELECT DISTINCT RecoNumber 
FROM Workbook2014_Test.dbo.Reco 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @RECO 
SET @NUMBER = 1 
SET @RECO_OLD = @RECO 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    UPDATE Workbook2014_Test.dbo.Reco 
    SET Item = @NUMBER 
    WHERE RecoNumber = @RECO 

    FETCH NEXT FROM db_cursor INTO @RECO 
    IF(@RECO != @RECO_OLD) 
     SET @NUMBER = 1 
    ELSE 
     SET @NUMBER = @NUMBER + 1 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 

Заранее благодарим за любые советы.

ответ

4

Вы можете использовать функцию ROW_NUMBER() для этого:

;WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY RecoNumber ORDER BY RecoNumber) AS UPD_Item 
       FROM YourTable 
      ) 
UPDATE cte 
SET Item = UPD_Item 

ROW_NUMBER() функция присваивает номер каждой строке. PARTITION BY является необязательным, но используется для начала нумерации для каждого значения в заданном поле или группе полей, то есть: если вы PARTITION BY Some_Date, то для каждого уникального значения даты нумерация начнется с 1. ORDER BY, конечно, используется для определения того, как подсчет должен идти и требуется в функции ROW_NUMBER().

Прежде чем использовать UPDATE, вы можете указать , у вас могут быть другие значения полей, которые вы предпочитаете ORDER BY.

Смежные вопросы