Sql server SQL Server-每N条记录递增一次的基于集合的方法

Sql server SQL Server-每N条记录递增一次的基于集合的方法,sql-server,increment,Sql Server,Increment,使用SQLServer2008 我正在研究一种将多张发票合并为一张发票的方法。如果我不提供发票ID,而是提供多张发票将关联的批次ID,我可以利用现有的索赔调整存储过程 这个问题的细节允许一些自动化:要分组的发票在其表中总是相邻的,并且每组批次中的组大小是恒定的 我的问题:T-SQL是否提供了一种基于集合(即不是循环)的方法,用于每N条记录自动递增一个“ID”列 我知道一种非基于集合的方法是使用游标和计数器,每次ID%N等于0时计数器都会递增。请参阅以下示例,了解每两条记录要递增的字段:

使用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
这还允许您确定分区和行号的顺序