现在有这样一张表
id,name
001 abc
004 abc
005 ab
007 abc
008 dc
045 ab
大概是这样记录,ID这一列不重复,也没有连续,name这一列有重复,现在需要将name这一列变为不重复,但是只是近用重复的后面第一个不变,其他的要加上1,2,3这样区别例如:
id,name
001 abc
004 abc1
005 ab
007 abc2
008 dc
045 ab1
这个需要怎么做呀

解决方案 »

  1.   

    tryupdate t set name=name+rtrim(row-1) from (select *,row=row_number()over(partition by name order by id) from tb)t where row>1
      

  2.   

    /*
    id,name
    001 abc
    004 abc
    005 ab
    007 abc
    008 dc
    045 ab
    */
    if OBJECT_ID('t1') is not null
    drop table t1
    create table t1 (id varchar(10),name varchar(10))
    insert t1
    select '001','abc' union all
    select '004','abc' union all
    select '005','ab' union all
    select '007','abc' union all
    select '008','dc' union all
    select '045','ab'
    go
    --select id,name,RANK()over(partition by name order by name) from t1
    ;with cte (rowid,id,name)
    as
    (
    select ROW_NUMBER()over(PARTITION by name order by id),id,name from t1
    )
    select id,(case rowid-1 when 0 then name else name+convert(varchar,rowid-1) end) as name from cte 
    order by id
    /*
    id name
    --  ----
    001 abc
    004 abc1
    005 ab
    007 abc2
    008 dc
    045 ab1
    */
    go
    drop table t1
      

  3.   

    select id,name=(case when row_number() over(partition by name order by id)=1 
    then name else name+convert(varchar,row_number() over(partition by name order by id)-1) end) 
    from  #TT order by id
      

  4.   

    with a as (         select * ,row_number() over(partition by name order by id )-1 as rn from a
              )update a set name = name + case when rn =0 then '' else rn end