我有一个表格,其中数据存储为:
我只希望以序列连续的方式更新Branch列。表示ID 1到4的行具有相同的值,但ID 5到7的行将使Branch为3,第8行和第9行的Branch为4,10到12的行的分支为5,依此类推
我想要的输出如下:
我不希望对行进行重新排序,这意味着行将具有与现在不断增加的ID列相同的顺序,并且只有要排序的分支列。 我尝试使用循环,但这部分变得如此庞大且容易出错,我正在考虑其他一些直接的方法。 是否有可能通过CTE或任何其他方法? 我怎么能这样做?
答案 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
<强>输出强>