我有以下数据:
[Receipt] [Date] [Barcode] [Quantity] [Supplier] [DeliveryID]
0001 01/01/2000 0000001 5 Grocery NULL
0001 01/01/2000 0000002 7 Grocery NULL
0001 01/01/2000 0000571 2 Grocery NULL
0002 01/01/2000 0000041 5 Grocey NULL
0002 01/01/2000 0000701 10 Grocey NULL
0003 01/01/2000 0000001 9 Groceri NULL
如何将增量值添加到
DeliveryID
?
正如您所看到的,没有什么可用于区分行与另一行的唯一性。很可能会再次输入类似这些行的类似数据。
不幸的是,我无法删除该表并为新列创建一个新表。
我首先尝试计算所有null
行,
SELECT COUNT(*) as TotalCount FROM dbo.Delivery WHERE DeliveryID IS NULL
创建一个for
循环进行更新。
但我意识到在第一个循环之后,所有null
都将被1
替换,而不是每个循环更新每一行。
我曾考虑将Receipt
和Supplier
组合成一个唯一值,但正如我之前所说,可能会输入类似的数据,从而造成重复的行,丢失行的唯一性
答案 0 :(得分:2)
使用row_number
with D as
(
select Receipt, Date, Barcode, DeliveryID, row_number() over(order by receipt , Date, Barcode) as rn
from delivery
)
update D
set DeliveryID = rn
where DeliveryID is null
您甚至可以按收据进行分区,以在收据组中提供每行:
with D as
(
select Receipt, Date, Barcode, DeliveryID, row_number() over(partition by receipt order by Date, Barcode) as rn
from delivery
)
update D
set DeliveryID = rn
where DeliveryID is null
答案 1 :(得分:1)
您可以使用以下列:
[Receipt] [Date] [Barcode] [Quantity]
作为PrimaryKey,以便您可以识别所需的行。
或者对于[交付ID]列,您可以使用IDENTITY函数:
答案 2 :(得分:0)
添加标识可以帮助您的列
像
alter table tableName add DeliveryID int Identity(1,1)