使用当前行和上一行值进行Oracle sql数学计算

时间:2016-12-20 07:32:11

标签: sql oracle

我有下表:

ID  A   B   C
1   1   23  22
2   2   19  20
3   5   18  15
4   3   12  12

A列和B列是常量。我想使用以下公式计算C列:

第一行

 C = B - A

之后

 C = previous(C) - A

我希望仅使用oracle SQL来实现这一目标。

2 个答案:

答案 0 :(得分:7)

如果您将数据以

的形式存储
    A    B       C
   a1   b1   b1 - a1     == b1 - a1
   a2   b2   c1 - a2     == b1 - a1 - a2 
   a3   b3   c2 - a3     == b1 - a1 - a2 - a3
   a4   b4   c3 - a4     == b1 - a1 - a2 - a3 - a4
   ...
   an   bn   cn-1 - an   == b1 - a1 - a2 - ... - an

您可以轻松地在分析函数中找到解决方案,例如

select A,
       B, 
       first_value(B) over(order by id) - sum(A) over (order by id) C
  from myTable   

请检查实际订单(我放order by id

答案 1 :(得分:0)

看看Oracle分析功能。 https://oracle-base.com/articles/misc/lag-lead-analytic-functions

在您的情况下,您正在尝试计算列C,这是一个派生列,并且此类派生列的先前值不能直接在LAG函数的公式中引用。

因此,技巧是使用列C的定义来派生每一行。在第3行中,C的值应为C@row2 - A@row3 = C@row1 - (A@row3 + A@row2) = C@row1 + A@row1 - sum(a @ row1,2,3),这不是sql语法,我只是想解释你的算法

当您尝试使用Oracle sql编写相同内容时,查询应该类似于

SELECT ID,A,B, (LAG(C_+A,RN-1,0) OVER (ORDER BY ID)) - SUM(A) OVER (ORDER BY ID) as c FROM(
  SELECT ID, A, B, B-A AS C_, ROWNUM RN FROM TEST
)

假设表名为TEST,列名为ID, A, B

结果看起来像

ID  A   B   C
1   1   23  22
2   2   19  20
3   5   18  15
4   3   12  12