В зависимости от того, как вы хотите, чтобы обрабатывать случай, когда существует нечетные строки (вы хотите больше C-й или более D's, вы могли бы сделать обновление строки, используя один из следующих двух утверждений слияния:
больше Ds:
merge into t1 tgt
using (select a,
case when rn/cnt <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over() cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
Больше Cs:
merge into t1 tgt
using (select a,
case when rn/decode(mod(cnt, 2), 0, cnt, 1, cnt + 1) <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over() cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
Смотрите ниже для полного сценария я использовал, чтобы проверить оба утверждения:
create table t1 as
select 1 a, cast(null as varchar2(2)) b from dual union all
select 2 a, null b from dual union all
select 3 a, null b from dual union all
select 4 a, null b from dual union all
select 5 a, null b from dual union all
select 6 a, null b from dual;
-- six rows, basic method - for odd rows, there will be a greater number of Ds
merge into t1 tgt
using (select a,
case when rn/cnt <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over() cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
commit;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 D
5 D
6 D
-- six rows, extended method - for odd rows, there will be a greater number of Cs
merge into t1 tgt
using (select a,
case when rn/decode(mod(cnt, 2), 0, cnt, 1, cnt + 1) <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over() cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
commit;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 D
5 D
6 D
insert into t1 (a, b)
values (7, null);
commit;
-- seven rows, basic method - for odd rows, there will be a greater number of Ds
merge into t1 tgt
using (select a,
case when rn/cnt <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over() cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 D
5 D
6 D
7 D
-- seven rows, extended method - for odd rows, there will be a greater number of Cs
merge into t1 tgt
using (select a,
case when rn/decode(mod(cnt, 2), 0, cnt, 1, cnt + 1) <= 0.5 then 'C'
else 'D'
end new_b
from (select a,
row_number() over (order by a) rn,
count(*) over() cnt
from t1)) src
on (tgt.a = src.a)
when matched then
update set tgt.b = src.new_b;
select * from t1;
A B
---------- --
1 C
2 C
3 C
4 C
5 D
6 D
7 D
drop table t1;
Вам нужно обновить свой вопрос с некоторыми образцами данных, а также вывод, который вы» ожидаем. – Boneist
Я сделал это сейчас – rahul
Итак, в вашей исходной логике у вас было 20 строк, а для первых 10 вы хотели, чтобы ваши значения столбца B были C, а для остальных вы хотели, чтобы значение было равным D. В вашем примере данных, есть 6 строк, и вы хотите 3 C и 3 D. Является ли фактическое требование «У меня есть X строк, и я хочу, чтобы первая половина строк имела B = C, а остальное - D»? – Boneist