如何在所有行中按顺序更新组号
Posted
技术标签:
【中文标题】如何在所有行中按顺序更新组号【英文标题】:How to update the Group Number in a sequence in all rows 【发布时间】:2017-05-03 05:12:57 【问题描述】:我有一个表格,其中数据存储为:
我只希望以序列连续的方式更新 Branch 列。表示从 ID 1 到 4 的行将具有相同的值,但从 ID 5 到 7 的行的 Branch 为 3,第 8 行和第 9 行的 Branch 为 4,从 10 到 12 的行的 Branch 为 5,依此类推.
我想要的输出如下所示:
我不希望对行进行重新排序,这意味着行将具有与现在相同的顺序,并且 ID 列不断增加,并且只有 Branch 列被排序。 我试着用循环来做,但那部分变得如此之大且容易出错,以至于我正在考虑其他一些直接的方法。 是否可以通过 CTE 或任何其他方法? 我该怎么做?
【问题讨论】:
the rows from ID 1 to 4 would have same value
...这与您的预期输出不符。我不明白你重新分配分支编号的逻辑。
好吧,让我们忘记 ID 为 1 和 2 的行有分支 2,那么从 1 到 4 的所有行都必须是新分支,依此类推。现在清楚了吗?感谢您的回复。
ID 1 到 4 的行具有相同的值,我的意思是第 1 行和第 2 行的分支为 1,第 3 行和第 4 行的分支为 2。
【参考方案1】:
SQL DEMO
我使用了比必要更多的列来显示正在发生的事情。 rn 只是为了展示 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
输出
【讨论】:
出色的答案。希望我能看到 OP 想要 +1 的内容。 完美,正是我想要的,非常感谢!干杯!以上是关于如何在所有行中按顺序更新组号的主要内容,如果未能解决你的问题,请参考以下文章
如何更新账单编号栏?或在 sql server 的列中按顺序排列