如何将当前行与另一行进行比较

问题描述 投票:0回答:1

如果下一组增加10,并按顺序更新流后,该组已更改。

我的逻辑是将第一行与另一行进行比较,如果第一行与另一行的时间递增1匹配,否则与该行的时间递增10不匹配。

  declare
          v_groupid varchar2(100);
          v_gameid varchar2(100);
          v_teamid varchar2(200);
          v_chest_no number;
          stmt VARCHAR2(2000);
    count1 number;
     temp number :=1;

         cursor c_stage is select distinct var_group_id from aokk_group_def where var_group_type='KR' 
         and var_group_category='T';
        begin
     -  open c_stage;
                 loop
                     fetch c_stage into v_groupid;

                     exit when c_stage%notfound;

                for i in (select distinct var_kalateamappreg_teamid,var_kalateamappreg_groupid from aokk_kalateamappreg_stage where
                    var_kalateamappreg_groupid between 'GR14' and 'GR17' order by var_kalateamappreg_groupid  )

                    loop

                    for j in (select distinct var_kalateamappreg_teamid,var_kalateamappreg_groupid from aokk_kalateamappreg_stage where
                    var_kalateamappreg_groupid between 'GR14' and 'GR17' order by var_kalateamappreg_groupid  )

                    loop


                      if (i.var_kalateamappreg_teamid=j.var_kalateamappreg_teamid) 
                       then 
                                UPDATE aokk_kalateamappreg_stage SET aokk_kalateamappreg_CHESTNO=temp
                                        WHERE  var_kalateamappreg_groupid=i.var_kalateamappreg_groupid and
                                         var_kalateamappreg_teamid=i.var_kalateamappreg_teamid; 
                                        temp:=temp+1;

                   elsif (i.var_kalateamappreg_teamid<>j.var_kalateamappreg_teamid) 
                               then 
                                UPDATE aokk_kalateamappreg_stage SET aokk_kalateamappreg_CHESTNO=temp
                                        WHERE  var_kalateamappreg_groupid=i.var_kalateamappreg_groupid and
                                         var_kalateamappreg_teamid=i.var_kalateamappreg_teamid; 
                                        temp:=temp+10;
                          end if;

                   end loop;
                      end loop;
                  end loop;

                 close c_stage;
     end;

我更新了表中的组ID,但尚未正确更新。

输出:

VAR_KALATEAMAPPREG_TEAMID VAR_KALATEAMAPPREG_GROUPID AOKK_KALATEAMAPPREG_CHESTNO 
281 GR14 43285 
283 GR14 43336 
267 GR14 43183 
249 GR14 43132 
248 GR14 43081 
247 GR14 43030 
240 GR14 42877 
244 GR14 42928 
238 GR14 42826 
280 GR14 43234 
320 GR14 43387 
246 GR14 42979 
239 GR16 43538 
326 GR16 43689 
270 GR17 43839 
273 GR17 44121 
271 GR17 43980 

预期输出:

VAR_KALATEAMAPPREG_TEAMID   VAR_KALATEAMAPPREG_GROUPID  AOKK_KALATEAMAPPREG_CHESTNO
238 GR14    42826
240 GR14    42827
244 GR14    42928
246 GR14    42929
247 GR14    42930
248 GR14    42931
249 GR14    42932
267 GR14    42933
280 GR14    42934
281 GR14    42935
283 GR14    42936
320 GR14    42937
239 GR16    42948 Increment by 10
326 GR16    42949
270 GR17    42950 Increment by 10
271 GR17    42951
273 GR17    42952

如果在胸部编号之后组也改变了,则编号也增加了10。

oracle plsql plsqldeveloper
1个回答
0
投票

您可以避免PLSQL并在递归查询中使用merge,其中,根据组的更改,计数器增加一或十(加一):

merge into stage
using (
    with 
      d as (
        select teamid, groupid, chestno, 
               row_number() over (order by groupid, teamid) rn 
          from stage where groupid between 'GR14' and 'GR17' ),
      c(teamid, groupid, rn, newchestno) as (
        select teamid, groupid, rn, chestno from d where rn = 1 
        union all
        select d.teamid, d.groupid, d.rn, 
               c.newchestno + case c.groupid when d.groupid then 1 else 11 end
          from c join d on d.rn = c.rn + 1 )
    select * from c) r
on (stage.teamid = r.teamid and stage.groupid = r.groupid)
when matched then update set chestno = newchestno

[dbfiddle] >>

示例链接:Recursive Subquery Factoring

© www.soinside.com 2019 - 2024. All rights reserved.