如何更新所有行中的序列号

时间:2017-05-03 05:12:58

标签: sql-server-2008 tsql

我有一个表格,其中数据存储为:

enter image description here

我只希望以序列连续的方式更新Branch列。表示ID 1到4的行具有相同的值,但ID 5到7的行将使Branch为3,第8行和第9行的Branch为4,10到12的行的分支为5,依此类推

我想要的输出如下:

enter image description here

我不希望对行进行重新排序,这意味着行将具有与现在不断增加的ID列相同的顺序,并且只有要排序的分支列。 我尝试使用循环,但这部分变得如此庞大且容易出错,我正在考虑其他一些直接的方法。 是否有可能通过CTE或任何其他方法? 我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

<强> SQL DEMO

我使用更多的列而非必要的只是为了显示正在发生的事情。这只是为了展示如何创建grp。你只需要grp到最终结果。

这个想法是基于Id创建一个组序列。然后使用DENSE_RANK()来获得你想要的序列。

这假设ID是没有漏洞的序号,如果您的ID有漏洞,则需要使用ROW_NUMBER()来创建序列。

WITH cte as (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY [Branch] ORDER BY [Id]) as rn,
           [Id] - ROW_NUMBER() OVER (PARTITION BY [Branch] ORDER BY [Id]) as grp
    FROM Table1
)    
SELECT *, DENSE_RANK() OVER (ORDER BY grp) as new_branch
FROM cte

<强>输出

enter image description here