简体   繁体   中英

PL/SQL Increase value of new row, with value of previous

I need to increase value of next NEWLOSAL row, to be bigger than one, from previous of NEWHISA . Like HISAL and LOSAL column. NEWLOSAL need to be previous NEWHISAL + 1 .

在此处输入图片说明

not that sure if this is what you want:

  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))  

This can efficiently be done using the merge statement and a window function:

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;

In SQL rows in a table (or a result) or not ordered, so the concept of a "previous" row only makes sense if you define a sort order. That's what the over (order by grade) does in the window function. From the screen shot I can not tell by which column this should be sorted.

The screen shot also doesn't reveal the primary key column of your table. I assumed it's named ID . You have to change that to reflect your real PK column name.

I also didn't include a partition by clause in the window function assuming that the formula should be applied for all rows in the same way. If this is not the case you need to be more specific with your sample data.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM