Sql 如何将上一行的值传递给当前行?
如何将前一行的结果传递给当前行的计算 考虑到单位和成本,我需要得到每笔交易的平均成本: 公式如下:Sql 如何将上一行的值传递给当前行?,sql,database,oracle,Sql,Database,Oracle,如何将前一行的结果传递给当前行的计算 考虑到单位和成本,我需要得到每笔交易的平均成本: 公式如下: 平均成本是交易成本的总和 如果类型为Sub,则Trx成本等于成本 如果类型为红色,则Trx成本为单位*(先前Trx成本之和/先前单位之和) |行|类型|单位|成本| TrxCost |平均成本| |1 | Sub | 0.2 | 1000 | 1000 | 1000| |2 | Sub | 0.3 | 2500 | 2500 | 3500| |3 | Sub | 0.1 | 600 | 600 |
select
lag(unit,1) over (partition by type order by whatever)
* lag(cost,1) over (partition by type order by whatever)
from Trx
但我仍然不知道您希望如何将交易和减少相互关联。一定有什么专栏你没告诉我们。如果该列(PartNumber?)已知,您可以简单地按该列分组和求和。请参阅,它允许您访问结果集中其他行的值。在您的情况下,您需要告诉我们更多关于何时停止查看的标准等:
select
lag(unit,1) over (partition by type order by whatever)
* lag(cost,1) over (partition by type order by whatever)
from Trx
但我仍然不知道您希望如何将交易和减少相互关联。一定有什么专栏你没告诉我们。如果该列(PartNumber?)已知,您可以简单地根据该列进行分组和求和。您可以使用递归CTE
WITH cte (row_num,
type,
unit,
sum_of_unit,
cost,
trxcost,
ave_cost
) AS (
SELECT row_num,
type,
unit,
unit AS sum_of_unit,
cost,
cost AS trxcost,
cost AS ave_cost
FROM t
WHERE row_num IN (
SELECT MIN(row_num)
FROM t
)
UNION ALL
SELECT t.row_num,
t.type,
t.unit,
c.sum_of_unit + t.unit AS sum_of_unit,
t.cost,
CASE t.type
WHEN 'Sub' THEN t.cost
WHEN 'Red' THEN t.unit * ( c.ave_cost / c.sum_of_unit )
END
AS trxcost,
c.ave_cost + CASE t.type
WHEN 'Sub' THEN t.cost
WHEN 'Red' THEN t.unit * ( c.ave_cost / c.sum_of_unit )
END AS ave_cost
FROM t
JOIN cte c ON t.row_num = c.row_num + 1
)
SELECT * FROM cte
您可以使用递归CTE
WITH cte (row_num,
type,
unit,
sum_of_unit,
cost,
trxcost,
ave_cost
) AS (
SELECT row_num,
type,
unit,
unit AS sum_of_unit,
cost,
cost AS trxcost,
cost AS ave_cost
FROM t
WHERE row_num IN (
SELECT MIN(row_num)
FROM t
)
UNION ALL
SELECT t.row_num,
t.type,
t.unit,
c.sum_of_unit + t.unit AS sum_of_unit,
t.cost,
CASE t.type
WHEN 'Sub' THEN t.cost
WHEN 'Red' THEN t.unit * ( c.ave_cost / c.sum_of_unit )
END
AS trxcost,
c.ave_cost + CASE t.type
WHEN 'Sub' THEN t.cost
WHEN 'Red' THEN t.unit * ( c.ave_cost / c.sum_of_unit )
END AS ave_cost
FROM t
JOIN cte c ON t.row_num = c.row_num + 1
)
SELECT * FROM cte
您可以分两次完成此操作:一次获取
成本,然后一次获取平均成本
顺便说一句,你所说的“平均”是一个连续的总数;你只是在增加价值
您需要在
子句之间具有行的窗口函数。(如果(SUM(…)超过(ORDER BY…
),则这是在无界的前一个和当前之间的隐式)
我重命名了您的行
列id
,因为行
是保留字
最后一行的结果与您的不同。我用了你的公式,但得到了不同的数字
Rextester演示:您可以通过两个步骤来完成此操作:一个是获取成本,另一个是获取平均成本
顺便说一句,你所说的“平均”是一个连续的总数;你只是在增加价值
您需要在
子句之间具有行的窗口函数。(如果(SUM(…)超过(ORDER BY…
),则这是在无界的前一个和当前之间的隐式)
我重命名了您的行
列id
,因为行
是保留字
最后一行的结果与您的不同。我用了你的公式,但得到了不同的数字
Rextester demo:我已经试过了,但我的问题是,我必须先计算前一行的平均成本,然后使用结果计算当前行的平均成本。我已经试过了,但我的问题是,我必须先计算前一行的平均成本,然后使用结果计算当前行的平均成本。哪个列标识哪一行是前一行?如果没有这个,你怎么知道哪一个是当前的,哪一个是前一个呢?我添加了行号。谢谢另外,当你说前几行的总和时,它是指成本的总和吗?trx成本的总和。谢谢提醒,最后一行的TrxCost=-3200是如何获得的?通过你的公式,我得到:-0.6*(1000+2500+600-1100+1000)/(0.2+0.3+0.1-0.2+0.3)=-3428.57哪一列标识哪一行是前一行?如果没有这个,你怎么知道哪一个是当前的,哪一个是前一个呢?我添加了行号。谢谢另外,当你说前几行的总和时,它是指成本的总和吗?trx成本的总和。谢谢提醒,最后一行的TrxCost=-3200是如何获得的?通过你的公式,我得到:-0.6*(1000+2500+600-1100+1000)/(0.2+0.3+0.1-0.2+0.3)=-3428.57Hi@kaushik-Nayak这太棒了。但没有给出trx成本和ave成本,需要先计算。只给出了单位和成本。@just10:这个解决方案已经考虑到了这一点。您应该看到更新的dbfiddle并使用此查询。很好!这真的很棒,但我会接受thorsten的回答,因为它的代码更短。希望您理解:)@just10:代码长度应该是您做出决定的最起码的标准。您应该检查这两种代码的性能,并使用最适合您的代码,重要的是,它应该为您提供正确的结果。我可以为您重新格式化代码并减少查询的行数,但这不是重点。但是,同样,你可以自由选择。我同意,查询的长度不应该触发决策。尤其是当查询结果不同时,就像我们的查询一样。我喜欢CTE方法。现在你的查询依赖于连续的行号,但是这些行号很容易生成。但没有给出trx成本和ave成本,需要先计算。只给出了单位和成本。@just10:这个解决方案已经考虑到了这一点。您应该看到更新的dbfiddle并使用此查询。很好!这真的很棒,但我会接受thorsten的回答,因为它的代码更短。希望您理解:)@just10:代码长度应该是您做出决定的最起码的标准。您应该检查这两种代码的性能,并使用最适合您的代码,重要的是,它应该为您提供正确的结果。我可以为您重新格式化代码并减少查询的行数,但这不是重点。但是,再一次,你可以自由选择