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:使用前一行计算值的主要内容,如果未能解决你的问题,请参考以下文章
当在应用中也计算前一个值时,Pandas 中是不是可以使用 dataframe.apply 中的前一行值?