SQL - 更新:重复条目的多重重命名
SQL - Update: multi renaming of repeated entries
在 Oracle 11 中我有这样的 table
ID Name
--------
1 Jim
2 John
3 Jim
4 Sue
5 Marc
6 Jim
现在我必须将名称修改为唯一;重复项将获得后缀。所以 table 应该看起来像
ID Name
--------
1 Jim_1
2 John
3 Jim_2
4 Sue
5 Marc
6 Jim_3
找到重复项是比较容易的部分,但是是否有 auto_rename 重复项并计算它们的例程(片段)?
感谢您的建议(初学者水平..)
这是一种选择;查看代码中的注释。
SQL> with test (id, name) as
2 -- sample data; you don't type that as you already have it in a table
3 (select 1, 'Jim' from dual union all
4 select 2, 'John' from dual union all
5 select 3, 'Jim' from dual union all
6 select 4, 'Sue' from dual union all
7 select 5, 'Marc' from dual union all
8 select 6, 'Jim' from dual
9 )
10 -- this is what you might need
11 select id,
12 name || case when cnt > 1 then '_' || rn end as name
13 from (-- count each name's appearance and find its row number
14 select id, name,
15 row_number() over (partition by name order by id) rn,
16 count(*) over (partition by name) cnt
17 from test
18 )
19 order by id;
ID NAME
---------- ------------------------------
1 Jim_1
2 John
3 Jim_2
4 Sue
5 Marc
6 Jim_3
6 rows selected.
SQL>
在 Oracle 11 中我有这样的 table
ID Name
--------
1 Jim
2 John
3 Jim
4 Sue
5 Marc
6 Jim
现在我必须将名称修改为唯一;重复项将获得后缀。所以 table 应该看起来像
ID Name
--------
1 Jim_1
2 John
3 Jim_2
4 Sue
5 Marc
6 Jim_3
找到重复项是比较容易的部分,但是是否有 auto_rename 重复项并计算它们的例程(片段)?
感谢您的建议(初学者水平..)
这是一种选择;查看代码中的注释。
SQL> with test (id, name) as
2 -- sample data; you don't type that as you already have it in a table
3 (select 1, 'Jim' from dual union all
4 select 2, 'John' from dual union all
5 select 3, 'Jim' from dual union all
6 select 4, 'Sue' from dual union all
7 select 5, 'Marc' from dual union all
8 select 6, 'Jim' from dual
9 )
10 -- this is what you might need
11 select id,
12 name || case when cnt > 1 then '_' || rn end as name
13 from (-- count each name's appearance and find its row number
14 select id, name,
15 row_number() over (partition by name order by id) rn,
16 count(*) over (partition by name) cnt
17 from test
18 )
19 order by id;
ID NAME
---------- ------------------------------
1 Jim_1
2 John
3 Jim_2
4 Sue
5 Marc
6 Jim_3
6 rows selected.
SQL>