如何根据另一列更新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
答案 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;