[英]Oracle PL/SQL : Accessing previous row calculated value in current row
看来您要执行的操作是对所有行进行累加运算。
您可以通过使用数学技巧(也称为自然对数和指数)来做到这一点,在此您可以对x值的自然对数进行累加和,然后使用指数函数将结果转换回整数:
WITH your_table AS (SELECT 'ABC' a, 12 x FROM dual UNION ALL
SELECT 'BBC' a, 20 x FROM dual UNION ALL
SELECT 'CBC' a, 10 x FROM dual UNION ALL
SELECT 'XYZ' a, 5 x FROM dual)
SELECT a,
x,
LAG(z, 1, 1) OVER (ORDER BY a) y,
z
FROM (SELECT a,
x,
EXP(SUM(LN(x)) OVER (ORDER BY a)) z
FROM your_table);
A X Y Z
--- ---------- ---------- ----------
ABC 12 1 12
BBC 20 12 240
CBC 10 240 2400
XYZ 5 2400 12000
然后,如果需要查看前一个值(又名y列),则可以在计算出的列周围抛出lag()来查找前一行的值(如果没有前一行,则为其分配1)。
预计到达时间:如果您已经有了一个包含信息的表,那么添加新行就成为查找最后一行并将其与新x值相乘的问题。 例如:
insert into your_table (a, x, y, z)
select 'YMX' a, 2 x, z as new_y, 2*z as new_z
from (select z,
row_number() over (order by a desc) rn
from your_table)
where rn = 1;
这会找到最新的行(我们使用row_number()分析函数来标记行,从最新的值开始(属于最后一行)),然后可以使用该行的z值来查找新行y值,然后乘以新的x值以找到新的z值。
然后,您只需要插入此行。
我认为最简单的方法根本不使用lag()
或子查询。 一种方法是简单划分:
SELECT a, x, y
( EXP(SUM(LN(x * y)) OVER (ORDER BY a)) ) / (x * y) as z
FROM t;
或者将window子句与coalesce()
:
SELECT a, x, y
COALESCE( EXP(SUM(LN(x * y)) OVER (ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)), 1 ) as z
FROM t;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.