代码之家  ›  专栏  ›  技术社区  ›  user_1234

用上一列的值更新表的新列,避免重复值

  •  0
  • user_1234  · 技术社区  · 5 年前

    我有一个表,其中有3列id、name、new_column。所以我的要求是将name列值添加到new_coolumn中,但如果namae列有重复的值,那么new_columns中的值应该是id+name值的组合

    表结构

    id  name   new_name (empty column)
    
    1  aaa
    2  bbb
    3  ccc
    4  ddd
    5  aaa
    6  eee
    7  ccc
    

    现在预期产量

    id名称new_name(空列)

    1  aaa     aaa
    2  bbb     bbb
    3  ccc     ccc     
    4  ddd     ddd
    5  aaa     5aaa (due to duplicate value id + name )
    6  eee     eee
    7  ccc     7ccc (due to duplicate value id + name )
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Gordon Linoff    5 年前

    如果你想把这些名字组合在一起 更新 ,则可以使用:

    update t join
           (select t.*, 
                   row_number() over (partition by name order by id) as seqnum
            from t
           ) tt
           on tt.id = t.id
        set t.name = concat(t.id, t.name)
        where tt.seqnum > 1;
    

    或者没有窗口功能:

    update t join
           (select name, min(id) as min_id 
            from t
            group by name
           ) tt
           on t.name = tt.name and t.id > tt.min_id
        set t.name = concat(t.id, t.name);
    
        2
  •  1
  •   D-Shih    5 年前

    如果你的MySQL版本支持 ROW_NUMBER +窗口函数,您可以尝试使用该函数生成一个seq数字,然后使用 CASE WHEN 判断是否重复

    架构(MySQL v8.0)

    CREATE TABLE T(
       id int,
       name varchar(50)
    );
    
    
        
    INSERT INTO T VALUES (1,'aaa');
    INSERT INTO T VALUES (2,'bbb');
    INSERT INTO T VALUES (3,'ccc');
    INSERT INTO T VALUES (4,'ddd');
    INSERT INTO T VALUES (5,'aaa');
    INSERT INTO T VALUES (6,'eee');
    INSERT INTO T VALUES (7,'ccc');
    

    查询#1

    SELECT name, 
          CASE WHEN rn = 1 THEN name ELSE CONCAT(id,name) END new_name 
    FROM (
      SELECT  *,ROW_NUMBER() OVER(PARTITION BY name ORDER BY id) rn
      FROM T
    ) t1
    ORDER BY id;
    
    名称 新名称
    aaa aaa
    bbb bbb
    ccc ccc
    ddd ddd
    aaa 5aaa
    eee eee
    ccc 7ccc

    View on DB Fiddle