Sql server SQL Server-每N条记录递增一次的基于集合的方法
使用SQLServer2008 我正在研究一种将多张发票合并为一张发票的方法。如果我不提供发票ID,而是提供多张发票将关联的批次ID,我可以利用现有的索赔调整存储过程 这个问题的细节允许一些自动化:要分组的发票在其表中总是相邻的,并且每组批次中的组大小是恒定的 我的问题:T-SQL是否提供了一种基于集合(即不是循环)的方法,用于每N条记录自动递增一个“ID”列 我知道一种非基于集合的方法是使用游标和计数器,每次ID%N等于0时计数器都会递增。请参阅以下示例,了解每两条记录要递增的字段:Sql server SQL Server-每N条记录递增一次的基于集合的方法,sql-server,increment,Sql Server,Increment,使用SQLServer2008 我正在研究一种将多张发票合并为一张发票的方法。如果我不提供发票ID,而是提供多张发票将关联的批次ID,我可以利用现有的索赔调整存储过程 这个问题的细节允许一些自动化:要分组的发票在其表中总是相邻的,并且每组批次中的组大小是恒定的 我的问题:T-SQL是否提供了一种基于集合(即不是循环)的方法,用于每N条记录自动递增一个“ID”列 我知道一种非基于集合的方法是使用游标和计数器,每次ID%N等于0时计数器都会递增。请参阅以下示例,了解每两条记录要递增的字段:
CREATE TABLE #BatchInvnums (id INT PRIMARY KEY IDENTITY, invnum INT, batchID INT)
INSERT INTO #BatchInvnums (invnum)
VALUES (178),(543),(724),(809),(164),(276)
DECLARE @CurrentID INT, @CurrentInvnum INT, @Counter INT = 0
DECLARE CurBatchIDSetter CURSOR FORWARD_ONLY FOR
SELECT ID, invnum
FROM #BatchInvnums
ORDER BY ID
OPEN CurBatchIDSetter
FETCH NEXT FROM CurBatchIDSetter INTO @CurrentID, @CurrentInvnum
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE #BatchInvnums
SET batchID = @Counter
WHERE invnum = @CurrentInvnum
IF @CurrentID % 2 = 0
BEGIN
SET @Counter = @Counter + 1
END
FETCH NEXT FROM CurBatchIDSetter INTO @CurrentID, @CurrentInvnum
END
CLOSE CurBatchIDSetter
DEALLOCATE CurBatchIDSetter
同样,以上是我不愿做的。为了达到这个效果,我想使用单个update语句,或者更好的是,在创建表时应用一些属性。有什么想法吗?我认为行号()
可能是解决问题的途径
update #BatchInvnums
set batchID = rn
from
#BatchInvnums
inner join
(select id,
(ROW_NUMBER()over(order by id)-1) / 2 rn
from #BatchInvnums) v
on v.id = #batchinvnums.id
使用(作为整数,然后是整数除法)怎么样
差不多
SELECT *,
(ROW_NUMBER() OVER(ORDER BY ID) - 1)/ 2 RowID
FROM TADA
这还允许您确定分区和行号的顺序