Oracle SQL:使用前一行计算值

Posted

技术标签:

【中文标题】Oracle SQL:使用前一行计算值【英文标题】:Oracle SQL: Calculate value using previous row 【发布时间】:2016-06-12 17:10:39 【问题描述】:

我有一个包含两列的表:Cur_value 和 Difference

       Cur_value        Difference
(-3)       3    
(-2)       4    
(-1)       5    
(1)                        1
(2)                       -2
(3)                        3
(4)     
(5)     
(6)     
(7)     

现在我想计算从第 (1) 行到第 (7) 行的 Cur_value 的值,以便

cur_value(t) = cur_value(t-3) + 差异(t)。

这意味着我的结果是:

           Value        Difference
(-3)           3    
(-2)           4    
(-1)           5    
(1)        3 + 1           1
(2)        4 - 2          -2
(3)        5 + 3           3
(4)    3 + 1 + 2           2
(5)    4 - 2 + 1           1
(6)    5 + 3 - 2          -2
(7) 3 + 1 + 2 - 1         -1

。 我的问题是:如何通过单个 Oracle SQL 语句执行此操作?

【问题讨论】:

【参考方案1】:

请注意,数据库表没有任何内在顺序。假设您有一些 id 或其他列可以用来定义行的顺序,您可以使用lag 函数来获取 t-3 记录:

SELECT cur_value, 
       difference, 
       LAG(cur_value, 3, 0) OVER (ORDER BY id) + difference AS new_cur_value
FROM   my_table

【讨论】:

【参考方案2】:

您需要将行分成 3 行并进行累计。像这样的:

  select t.*,
         (max(cur_value) + over (partition by grp) +
          sum(difference) over (partition by grp order by id)
         ) as value
  from (select t.*, mod(row_number() over (order by id) , 3) as grp
        from t
       ) t

子查询将行分为三组。 max 函数从第一行获取当前值。第二个是差的累积和。

【讨论】:

以上是关于Oracle SQL:使用前一行计算值的主要内容,如果未能解决你的问题,请参考以下文章

根据行号执行 SQL 更新并使用前一行进行计算

有没有办法引用前一行的计算值并在下一行的计算中使用它?

当在应用中也计算前一个值时,Pandas 中是不是可以使用 dataframe.apply 中的前一行值?

在 T-SQL FAST 中计算前 1440 行的高低?

在 SQL Server 中使用上一行和下一行值 (LAG & LEAD) 计算总结束数量

sql 计算在线时间总长