[英]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.