Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g 偏移和分组_Oracle11g_Plsqldeveloper - Fatal编程技术网

Oracle11g 偏移和分组

Oracle11g 偏移和分组,oracle11g,plsqldeveloper,Oracle11g,Plsqldeveloper,我有两列“a”和“b”。a列有20条记录,我想从“a”列中选择前10条记录,并将“b”列更新为“c” 然后从a中选择接下来的10条记录,并将列“b”更新为“d”。? 我怎样才能做到这一点?有可能在其中使用偏移吗? 我尝试使用分区,但没有太大帮助,然后我想到了偏移量,但我如何循环选择10条记录并更新值 A B 1 2 3 4 5 6 我想取A的前三条记录,用C更新B,然后取下三条记录,用D更新B A B 1 C 2 C 3 C 4 D 5 D 6 D 根据您想要如何处理奇数行的情

我有两列“a”和“b”。a列有20条记录,我想从“a”列中选择前10条记录,并将“b”列更新为“c” 然后从a中选择接下来的10条记录,并将列“b”更新为“d”。? 我怎样才能做到这一点?有可能在其中使用偏移吗? 我尝试使用分区,但没有太大帮助,然后我想到了偏移量,但我如何循环选择10条记录并更新值

A B
1
2
3
4
5
6
我想取A的前三条记录,用C更新B,然后取下三条记录,用D更新B

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

根据您想要如何处理奇数行的情况—您想要更多的C还是更多的D,您可以使用以下两条合并语句之一更新行:

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;
更多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;
更多政务司司长:

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;

你需要用一些样本数据和你期望的输出更新你的问题。好吧,在你的原始逻辑中,你有20行,前10行你希望你的B列值是C,其余的你希望值是D。在你的样本数据中,有6行,你想要3个C和3个D。实际的要求是,我有X行,我希望前半行有B=C,其余的是D?是的,完全正确…如果我们不进入奇数和偶数,并生成一个序列,假设给出C,D,e的输出,这必须在一个过程中完成。。。哪一个会进一步用c更新A列的前3条记录,然后用d更新下3条记录…依此类推,直到A中的所有记录都有相应的B…那么你建议我们怎么做呢?如果我更新t1集合B=c,其中A在从t1中选择A,其中B为空,只获取前3行,并将其保持在循环中以更新A的其余行?但是此查询不起作用,因为它表示缺少右键