如何为 SQL 中的每个不同值迭代一个 int 列?

How to iterate an int column for each distinct value in 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

提前感谢任何提示。

您可以为此使用 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() 函数中是必需的。

您可以 SELECT * FROM cte 先观察 运行 和 UPDATE 之前的新值,您可能还有其他字段值 ORDER BY