我有下表:
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
来实现这一目标。
答案 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