我基本上有几百行的列A和B。列C意味着等于lag(C)*A+B。
但是由于递归CTE要求您在以下形式中进行操作:
Select
Union
Select我通过逐行编号/键控/索引列A和B来解决这个问题,然后让递归CTE在它们的键与数据的键相等时通过连接来保持跟踪。但我意识到,如果它检查密钥是否相等,这是非常低效的,因为每次只有一个匹配。但是,即使向子查询添加限制1也是低效的;为什么它必须连接呢?它总是数据中的下一行。任何提示或见解都会有所帮助。
同样,我拥有的是A列、B列、行列,C是(之前的C)*A+B
我目前的解决方案是这样的:
with recursive CTE (row, C) as (
select 0,0
union all
select row+1,C*data.A+data.B
from CTE
join data on data.row = CTE.row
where CTE.row <= # of data.rows
)编辑:对于其他上下文,这是用于区块链分析的,任务是查找应计利息和零星转账/转出的帐户的最终余额。"A“是利率乘数,比如1.005,"B”是转进/转出,正,负,通常是0。余额是我要查找的"C“列,也是最后一个值。无法从我的数据源获得最终余额的原因是,在区块链上,数据仅记录在传输上。利率的更新是分开的。我必须将来自A和B的数据完全连接到一个账本中,这个账本上有每个利率的支付和转移的时间顺序。现在,我正在尝试以一种更有效的方式从这些数据中计算余额。
该站点只允许postgresql,但在这里,有问题的CTE是sOHMbalances:https://dune.xyz/queries/129943
发布于 2021-09-04 18:11:03
从您对问题的描述来看,我希望CTE看起来像这样:
with recursive cte as (
select a, b, a + b as c
from data
where row = 1
union all
select d.a, d.b, cte.c * d.a + d.b
from data d join
cte
on d.row = cte.row + 1
)
select *
from cte;如果未定义row,则需要使用row_number()定义其他逻辑。
https://stackoverflow.com/questions/69056709
复制相似问题