gpt4 book ai didi

sql - 在 Oracle 中引用上一个计算值的值

转载 作者:行者123 更新时间:2023-12-04 23:56:09 24 4
gpt4 key购买 nike

如何在 SQL 查询中引用前一行的计算值?在我的情况下,每一行都是一个事件,它以某种方式操纵前一行的相同值。

原始数据如下所示:

Eventno Eventtype Totalcharge
3 ACQ 32
2 OUT NULL
1 OUT NULL

假设每个 Eventtype=OUT 应该是名为 Remaincharge 的列中前一行总电荷的一半:

Eventno Eventtype Totalcharge Remaincharge
3 ACQ 32 32
2 OUT NULL 16
1 OUT NULL 8

我已经尝试过 LAG 分析函数,但这不允许我从前一行获得计算值。尝试过这样的事情:

LAG(remaincharge, 1, totalcharge) OVER (PARTITION BY ...) as remaincharge

但这不起作用,因为找不到剩余电荷。

任何想法如何实现这一目标?需要一个分析函数,它可以给我累积总和,但给定一个函数,而不是访问以前的值。

先感谢您!

更新问题描述

恐怕我的示例问题很笼统,这里有一个更好的问题描述:

总费用的剩余部分由outqty/(以前的剩余数量)的比率决定。

Eventno Eventtype Totalcharge Remainqty Outqty
4 ACQ 32 100 0
3 其他 NULL 100 0
2 OUT NULL 60 40
1 输出 NULL 0 60

Eventno Eventtype Totalcharge Remainqty Outqty Remaincharge
4 ACQ 32 100 0 32
3 其他 NULL 100 0 32 - (0/100 * 32) = 32
2 OUT NULL 60 40 32 - (40/100 * 32) = 12.8
1 OUT NULL 0 60 12.8 - (60/60 * 12.8) = 0

最佳答案

在您的情况下,您可以使用 FIRST_VALUE() 计算出第一个值解析函数和必须除以的 2 的幂 RANK()在子查询中,然后使用它。它对您的示例非常具体,但应该为您提供总体思路:

select eventno, eventtype, totalcharge
, case when eventtype <> 'OUT' then firstcharge
else firstcharge / power(2, "rank" - 1)
end as remaincharge
from ( select a.*
, first_value(totalcharge) over
( partition by 1 order by eventno desc ) as firstcharge
, rank() over ( partition by 1 order by eventno desc ) as "rank"
from the_table a
)

这是一个 SQL Fiddle展示。我没有按任何分区进行分区,因为您的原始数据中没有任何内容可以分区...

关于sql - 在 Oracle 中引用上一个计算值的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16143769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com