使用组内的增量编号更新表行

Mar*_*rcM 1 sql sql-server sql-server-2000

我需要更新一个表,以便同一“组”(示例中为“代码+颜色”)的行在该组中获得一个递增的数字。每个组的行应编号为1、2、3 ...

id   | Code | Color   |Required_New_field
--------------------------
1231 |001   |Red      | 1
1232 |001   |Red      | 2
1233 |002   |Red      | 1
1234 |001   |Red      | 3
1235 |001   |Blue     | 1
1236 |002   |Red      | 2
1237 |001   |Blue     | 2
1238 |002   |Blue     | 1
1239 |002   |Red      | 3
...
Run Code Online (Sandbox Code Playgroud)

在示例中,Code = 001和Color = Red的行应分别获得1、2、3。

我尝试了使用子查询和“分组依据”的几种方法,但是我意识到这实际上不是正确的方法。

任何提示将不胜感激!

编辑: ROW_NUMBER()个答案很棒!可悲的是,我必须在旧的sql_server 2000版本上运行它。ROW_NUMBER()在2005年及更高版本上可用(有关详细信息,请参见此处)。还有其他选择吗?

Gor*_*off 5

您可以使用row_number()以下方法计算数字:

select t.*,
       row_number() over (partition by code, color order by id) as required_new_field
from t;
Run Code Online (Sandbox Code Playgroud)

要进行更新,请使用可更新的CTE:

with toupdate as (
       select t.*,
              row_number() over (partition by code, color order by id) as seqnum
       from t
      )
update toupdate
    set required_new_field = seqnum;
Run Code Online (Sandbox Code Playgroud)

  • row_number在2005年也可用,以上代码在2005年有效 (2认同)