更新:
请注意,我已回答了这个问题here,因此也可以将此问题视为已关闭/已回答。
所以,我是递归SQL的新手(我使用Oracle)。我试图在SQL中解决这个特定的等式(我遵循下面的LaTeX表示法):
U^{F,D}_{t,p} = [\sum_{D}( U^{F,D}_{t-1,p}*BPX^{F}_{t} ) + C_{t-1,p}]*R^{F,D}_{t-1,p}*(1/BPX^{F}_{t})
导致
在单词中:它是一个迭代方程式,您将获得U^{F,D}_{t=0,p}
(从时间开始考虑t
),您的任务是向前滚动t>0
。
SQL数据可能看起来像this fiddle that I link here。因此,等式中使用的所有其他变量/数据已经存在,计算出来,因此在t
上只有U^{F,D}_{t>0,p}
一个人不知道。任务是从t
(或t-1
获取它们,如果上面的等式所示),并用于计算U^{F,D}_{t>0,p}
。
为此,我在the fiddle linked above中提出了递归查询,我在此处粘贴以供参考:
--
-- T -> t
-- T_M1 -> t-1
-- e.g.:
-- BPX_T -> BPX^{F}_{t}, etc.
--
WITH RECU( T, T_M1, T_MAX, P, F, DELTA_F, BPX_T,
R_T_M1, C_T_M1, U_T_M1,
R_T, C_T, U_T ) AS (
-- Anchor member.
SELECT T,
T_M1, T_MAX,
P,
F, DELTA_F,
BPX_T,
R_T_M1, C_T_M1,
U_T_M1,
R_T, C_T,
U_T
FROM DYNAMICS
-- Initial condition: U_{t-1} does not exist, and U_{t=0} is given
WHERE ( U_T_M1 IS NULL AND U_T IS NOT NULL )
UNION ALL
-- Recursive member.
SELECT NEW.T,
NEW.T_M1, NEW.T_MAX,
NEW.P,
NEW.F, NEW.DELTA_F,
NEW.BPX_T,
NEW.R_T_M1, NEW.C_T_M1,
-- NEW.U_T_M1,
RECU.U_T AS U_T_M1,
NEW.R_T, NEW.C_T,
-- NEW.U_T
((RECU.U_T*NEW.BPX_T)+NEW.C_T_M1)*(NEW.R_T_M1/NEW.BPX_T) AS U_T
FROM DYNAMICS NEW
INNER JOIN RECU
ON
-- Translates: yesterday (t-1) of the new record equals today (t) of the parent record
NEW.T_M1 = RECU.T AND
NEW.P = RECU.P AND
NEW.F = RECU.F AND
NEW.DELTA_F = RECU.DELTA_F
)
SELECT * FROM RECU ORDER BY P, F, T;
(其中上述原始数学等式中的D对应于SQL查询中的DELTA)。
所以,上面的内容现在正在发挥作用,因为人们可以检查小提琴。问题是我欺骗了,只输入数据DELTAs(Ds)总是有一个值0.0,而原始数学方程式说的是我应该允许不同的DELTAs(Ds)值,并且我应该总结它们(\sum_{D}
)对于给定的t
。所以,为了做到这一点,我需要在上面的查询中使用某种GROUP BY/SUM
表达式,但我不知道如何将其压缩,以便我的递归不会受到伤害。
我非常感谢任何帮助。