如何为 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
。
我一直在尝试通过查询来更新我当前的数据库,但我不知道该怎么做。我一直在尝试使用游标,但我找不到一种方法来隔离每一行,而不是将不同列的所有行都设置为相同的值。
这是我数据库中的内容:
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
。