如何在所有行中按顺序更新组号

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 的列中按顺序排列

如何在 XSL 中按顺序将所有消息连接在一起?

当列值更改时,如何将组号添加到 SQL Server 2012 中的顺序记录?

如何在一行中按顺序对所有项目的总金额进行分组

如何在 Core Data 中按顺序存储数据? [复制]

如何在 html 5 中按顺序播放多个音频文件?