使用增加的ID更新Sql Server行

时间:2013-10-30 08:33:19

标签: sql-server sql-server-2008

如何根据另一列更新ID更新sql server?

我有一个包含以下结构的表:

sn  name    val
    test     0
    test     0.5
    test     2
    test1    0
    test1    0.5
    test1     2

如何更新它以便:

sn  name      val
1    test      0
2    test      0.5
3    test      2
1    test1     0
2    test1     0.5
3    test1     2

fiddle

3 个答案:

答案 0 :(得分:2)

使用cte和row_number

以下是一个例子:

create table #mytable (sn int, name varchar(20), val money)

insert into #mytable values (null, 'test', 0.5)
insert into #mytable values (null, 'test', 1)
insert into #mytable values (null, 'test1', 0.5)
insert into #mytable values (null, 'test1', 1)

;with cte as (select row_number() over (order by name, val) as rn, * from #mytable)
update cte set sn = rn

select * from #mytable

答案 1 :(得分:1)

如果您在表格中有一个键列,则可以使用Row_Number()OVER ... PARTITION BY clause轻松完成此操作。我添加了一列:Id int identity primary key,这是更新:

;with RowNumberedData as (
  select 
    id, 
    row_number() over (
      partition by name
      order by id
    ) as rowno
  from sql_test
)
update s
  set sn = r.rowno
from sql_test s
join RowNumberedData r
  on s.id = r.id;

SQLFiddle:http://sqlfiddle.com/#!3/43fa8/4

答案 2 :(得分:1)

您应该使用ROW_NUMBER()功能。此外,只要您必须为每个NAME值启动新计数器,就应在此声明中使用PARTITON by NAME

WITH T AS 
(select sql_test.*,
        ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Val) as RowNumber
        from sql_test)
UPDATE T SET SN=RowNumber;

SQLFiddle demo