簡體   English   中英

Oracle PL / SQL:訪問當前行中的上一行計算值

[英]Oracle PL/SQL : Accessing previous row calculated value in current row

嘗試計算列的值,其中將根據上一行的計算值來計算該值。 (如下圖所示)

圖片

其中的Z列是X * Y的乘積,是計算所得的列,如果沒有前一行,則Y列的值應為1,否則該值應為Z列的前值。

可以使用Cursor來實現,但是嘗試使用SQL Query來找到它。

看來您要執行的操作是對所有行進行累加運算。

您可以通過使用數學技巧(也稱為自然對數和指數)來做到這一點,在此您可以對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM