2016-01-07 2 views
0

У меня есть 2 столбца 'a', 'b'.column a имеет 20 записей, и я хочу выбрать первые 10 записей из столбца' a 'и обновить столбец' b 'для них как' c ' а затем выберите следующие 10 записей из столбца a и update «b» для них как «d».? Как я могу это сделать? Можно ли использовать его в комплекте? Я пробовал с разделом, но это не очень полезно, тогда я думал о смещениях, но там, как я зацикливаю выбор 10 записей за раз и обновляю значение?Смещение и группировка

A B 
1 
2 
3 
4 
5 
6 

И Я ХОЧУ ВЗЯТЬ 1ST ТРИ ОТЧЕТ А И ОБНОВЛЕНИЕ В ПО С И СЛЕДУЮЩИЙ 3 RECORD И ОБНОВЛЕНИЕ В AS D

A B 
1 C 
2 C 
3 C 
4 D 
5 D 
6 D 
+0

Вам нужно обновить свой вопрос с некоторыми образцами данных, а также вывод, который вы» ожидаем. – Boneist

+0

Я сделал это сейчас – rahul

+0

Итак, в вашей исходной логике у вас было 20 строк, а для первых 10 вы хотели, чтобы ваши значения столбца B были C, а для остальных вы хотели, чтобы значение было равным D. В вашем примере данных, есть 6 строк, и вы хотите 3 C и 3 D. Является ли фактическое требование «У меня есть X строк, и я хочу, чтобы первая половина строк имела B = C, а остальное - D»? – Boneist

ответ

0

В зависимости от того, как вы хотите, чтобы обрабатывать случай, когда существует нечетные строки (вы хотите больше 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; 
+0

Если мы не попадаем в нечетное и четное число и сгенерируем последовательность, которая, предположим, даст результат c, d, e ..., который далее обновит первый 3 запись столбца A с c, а затем следующая 3 с d ... и так далее, до тех пор, пока все записи в A не будут соответствовать B .. то как вы предлагаете, мы идем по этому поводу? – rahul

+0

Что делать, если я обновляю t1 set b = c где a in (выберите a из t1, где b - нулевая выборка только первые 3 строки) и сохраните это в цикле для обновления остальных строк a, но этот запрос не работает говорит, что отсутствует правая часть – rahul

 Смежные вопросы

  • Нет связанных вопросов^_^