更新组内增量编号的表行

时间:2017-04-10 11:09:16

标签: 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
...

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

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

任何暗示都会受到赞赏!

编辑: ROW_NUMBER()答案很棒!遗憾的是,我必须在旧的sql_server 2000版本上运行它。并且ROW_NUMBER()在2005年及以上可用(有关可用性的详细信息here)。任何替代方案?

2 个答案:

答案 0 :(得分:4)

您可以使用row_number()来计算数字:

select t.*,
       row_number() over (partition by code, color order by id) as required_new_field
from t;

要进行更新,请使用可更新的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;

答案 1 :(得分:3)

虽然我同意SQL Server 2005中ROW_NUMBER()可用的评论中的所有人,但这里是使用COUNT()子查询的替代解决方案。可以在SQL Server 2000上使用。请注意,在性能方面,它的成本要高得多:

SELECT 
    t2.*,
    (SELECT COUNT(*) 
     FROM your_table t1 
     WHERE t1.code = t2.code 
       AND t1.color = t2.color
       AND t1.id <= t2.id) AS Rn
FROM 
    your_table t2

编辑 - 更新:

UPDATE t2 
SET RN = (SELECT COUNT(*) 
          FROM your_table t1 
          WHERE t1.code = t2.code 
            AND t1.color = t2.color
            AND t1.id <= t2.id) 
FROM your_table t2