如何将当前行与另一行进行比较
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
【讨论】:
以上是关于如何将当前行与另一行进行比较的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将数据帧的一列中的所有行与另一个数据帧的另一列(火花)中的所有行进行比较?
如何将数据框中的一行的值与另一个数据框中的多行进行比较(包括计算)