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

Posted

技术标签:

【中文标题】如何将当前行与另一行进行比较【英文标题】:how to compare current row to another row 【发布时间】:2019-11-25 12:06:08 【问题描述】:

如果在将下一个组增加 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 之后组发生了变化。

【问题讨论】:

您的代码不包含COMMIT 语句。您需要将更改提交到数据库,以便其他会话可以看到它们。 现在我把提交和输出会显示错误 请解释预期的输出,因为它不一致。第 14 组到第 16 组的变化使胸部增加了 10(如描述所预期的那样)。但是从第 16 组到第 17 组的更改使胸部增加了 11。因此,如果存在另一个组(例如第 20 组),胸部会增加 10 或 11 或者可能是 12(由于组更改 +10 + 先前组更改的 2)。您发布的数据似乎取决于按组排序,但最初的尝试并没有强制执行。这是必需的吗?最后,如果将团队 id 为 210 和 271 的行颠倒过来(也不对这些行强制排序),结果会怎样? 【参考方案1】:

您可以避免使用 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

【讨论】:

以上是关于如何将当前行与另一行进行比较的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将数据帧的一列中的所有行与另一个数据帧的另一列(火花)中的所有行进行比较?

如何将数据框中的一行的值与另一个数据框中的多行进行比较(包括计算)

如何计算当前行与下一行?

如何将char数组中的值与另一个char进行比较

将一个表中的值与另一表中具有相同属性的值的平均值计算进行比较

Kusto:将结果集中的每一行与另一个表进行比较