我在oracle中有一个包含3列的表:
create table pruebaBorrado (
num1 varchar2(24),
num2 varchar2(24),
num3 varchar2(24));
,表格包含:
insert into pruebaBorrado values ('1','1','1');
insert into pruebaBorrado values ('1','1','1');
insert into pruebaBorrado values ('1','1','1');
insert into pruebaBorrado values ('2','2','2');
insert into pruebaBorrado values ('2','2','2');
insert into pruebaBorrado values ('3','3','3');
如您所见,有重复的行。我想改变' num3'列仅用于重复的行并获得以下内容:
'1', '1', '1'
'1', '1', '1A'
'1', '1', '1B'
'2', '2', '2'
'2', '2', '2A'
'3', '3', '3'
我该怎么做?在此先感谢!!
答案 0 :(得分:0)
这有点蛮力,但确实有效:
update pruebaBorrado
set num3 = (case (select count(*)
from pruebaBorrado pb
where pb.num1 = pruebaBorrado.num1 and pb.num2 = pruebaBorrado.num2 and
pb.rowid <= pruebaBorrado.rowid
)
when 1 then num3
when 2 then num3 || 'A'
when 3 then num3 || 'B'
when 4 then num3 || 'C'
else num3 || 'X'
end
);
SQL小提琴是here。
编辑:
以下内容也应该有效:
update pruebaBorrado
set num3 = num3 ||
substr(' ABCDEFGHIJKLMNOPQRSTUVWXYZ,
(select count(*)
from pruebaBorrado pb
where pb.num1 = pruebaBorrado.num1 and pb.num2 = pruebaBorrado.num2 and
pb.rowid <= pb.rowid
), 1);
答案 1 :(得分:0)
这是有效的,经过测试。我在这里使用chr()将ascii值转换为char以获得A,B,C ..和秩函数。
update pruebaBorrado pb1
set num3 = num3 || (
select chr(temp.rank+63)
from ( select rowid, rank() over ( partition by num1,num2,num3 order by rowid ) rank
from pruebaborrado pb2 ) temp
where
temp.rowid = pb1.rowid
and temp.rank >1
);
逻辑如下:
排名功能会对每个重复行进行排名,如下所示:
<强> NUM1 | NUM2 | NUM3 |秩强>
1 | 1 | 1 | 1
1 | 1 | 1 | 2
1 | 1 | 1 | 3个
此等级用于通过向其添加63来为A,B,C生成ASCII。使用63是因为我们需要为第一个副本附加A,其等级为2,A的ASCII值为65.