PL / SQL增加新行的值,其值为previous

时间:2016-01-20 07:21:58

标签: sql oracle sql-update

我需要从NEWLOSAL的前一个增加下一个NEWHISA行的值,使其大于1。 与HISALLOSAL列一样。 NEWLOSAL需要先前NEWHISAL + 1

enter image description here

2 个答案:

答案 0 :(得分:1)

不确定这是否是你想要的:

  update table1 t1 
    set t1.Newlosal=case when t1.grade=1 then (t1.Newhisal+1) else (select t2.Newhisal+1 from table1 t2 where t2.grade = (t1.grade-1)) end
    WHERE EXISTS (
SELECT 1
  FROM table1 t2
 WHERE t2.grade=(t1.grade-1))  

答案 1 :(得分:0)

这可以使用merge语句和窗口函数有效地完成:

merge into table1 tg
using
(
   select id, -- I assume this is the PK column
          lag(newhisal) over (order by grade) + 1 as new_losal
   from table1
) nv on (nv.id = tg.id)
when matched then update 
   set tg.newlosal = nv.new_losal;

在表中的SQL行(或结果)中或者没有排序,所以"之前的概念"如果您定义排序顺序,则行才有意义。那是over (order by grade)在窗口函数中的作用。从屏幕截图中我无法确定应该对哪一列进行排序。

屏幕截图也没有显示表格的主键列。我认为它的名字是ID。您必须更改它以反映您的真实PK列名称。

我也没有在窗口函数中包含partition by子句,假设公式应该以相同的方式应用于所有行。如果不是这种情况,则需要更准确地了解样本数据。