这对我来说是一个非常复杂的情况,我想知道是否有人可以帮助我:
这是我的表:
Record_no Type Solde SQLCalculatedPmu DesiredValues
------------------------------------------------------------------------
2570088 Insertion 60 133 133
2636476 Insertion 67 119,104 119,104
2636477 Insertion 68 117,352 117,352
2958292 Insertion 74 107,837 107,837
3148350 Radiation 73 107,837 107,83 <---
3282189 Insertion 80 98,401 98,395
3646066 Insertion 160 49,201 49,198
3783510 Insertion 176 44,728 44,725
3783511 Insertion 177 44,475 44,472
4183663 Insertion 188 41,873 41,87
4183664 Insertion 189 41,651 41,648
4183665 Radiation 188 41,651 41,64 <---
4183666 Insertion 195 40,156 40,145
4183667 Insertion 275 28,474 28,466
4183668 Insertion 291 26,908 26,901
4183669 Insertion 292 26,816 26,809
4183670 Insertion 303 25,842 25,836
4183671 Insertion 304 25,757 25,751
在我的表格中,SQLCalculatedPmu
列或desiredValue
列中的每个值都是根据前一个值计算的。
如您所见,我根据3位小数的回合计算了SQLcalculatedPMU
列。情况是,在每个线辐射上,客户端想要基于2个小数而不是3(在期望值列中表示)开始下一个计算。将重新计算下一个值。例如,第6行将更改为第5行中的值现在为2位小数。我可以处理这个,如果有一个单一的辐射,但在我的情况下,我有很多辐射,在这种情况下,他们将根据两位小数的计算改变所有。
总之,以下是步骤:
1 - round the value of the preceding row of a raditaiton and put it in the radiation row.
2 - calculate all next insertion rows.
3 - when we reach another radiation we redo steps 1 and 2 and so on
我正在使用oracle DB而我是所有者所以我可以制作程序,插入,更新,选择。 但我不熟悉程序或循环。
有关信息,这是SQLCalculatedPmu的公式使用两个额外的culmns价格和数字,这是每个投资者累计计算的每一行:
(price * number)+(cumulative (price*number) of the preceeding lines)
我试过这样的事情:
update PMUTemp
set SQLCalculatedPmu =
case when Type = 'Insertion' then
(number*price)+lag(SQLCalculatedPmu ,1) over (partition by investor
order by Record_no)/
(number+lag(solde,1) over (partition by investor order by Record_no))
else
TRUNC(lag(SQLCalculatedPmu,1) over partition by invetor order by Record_no))
end;
但是我给了我这个错误(我认为这是因为我正在查看在SQL语句中修改的本行的前导行):
ORA-30486 : window function are allowed only in the SELECT list of a query.
我想知道是否创建一个程序会被调用尽可能多的时间,因为辐射的数量可以完成工作,但我真的不擅长程序
任何帮助 的问候,
只是为了让我的需求更简单,我想要的是从SQLCalculatedPmu列开始的DesiredValues列。步骤
1 - on a radiation the value become = trunc(preceding value,2)
2 - calculate all next insertion rows this way : (price * number)+(cumulative (price*number) of the preceeding lines). As the radiation value have changed then I need to recalculate next lines based on it
3 - when we reach another radiation we redo steps 1 and 2 and so on
最诚挚的问候
答案 0 :(得分:0)
这里不需要一个过程 - 表中Radiation行的SQL更新可以更快,更可靠地执行此操作。
像...这样的东西。
update my_table t1
set (column_1, column_2) =
(select round(column_1,2), round(column_2,2)
from my_table t2
where t2.type = 'Insertion' and
t2.record_no = (select max(t3.record_no)
from my_table t3
where t3.type = 'Insertion' and
t3.record_no < t1.record_no ))
where t1.type = 'Radiation'