【问题标题】:Oracle sql math calculation using current and previous row valuesOracle sql 数学计算使用当前和前一个行值
【发布时间】:2016-12-20 07:32:10
【问题描述】:

我有下表:

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 来实现这一点。

【问题讨论】:

  • 行序是什么?因为数据库可以按任何顺序检索行。
  • @GurwinderSingh 我相信ID 是一个安全的假设。
  • 我添加了一个 ID 列,用于行顺序
  • 第一行你想得到什么?没有“以前的”。
  • @Boneist 列 ID、A、B 是输入,C 列是我想要得到的

标签: sql oracle


【解决方案1】:

如果你把你的数据的形式放在

    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

【讨论】:

  • 老鼠们,我慢了 16 秒! *{;-)我想是(order by id)
  • @Dmitry 真棒
  • @Dmitry - 感谢您的明确细分,我正在为类似的事情苦苦挣扎,您的解释为我钉上了钉子。我能够使用逻辑来分解我的公式并让它发挥作用。
【解决方案2】:

看看 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 2015-07-09
    • 2022-01-18
    • 2021-11-24
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多