具有聚合函数

时间:2015-11-22 00:33:05

标签: sql oracle recursion

更新:

请注意,我已回答了这个问题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})

导致

enter image description here

在单词中:它是一个迭代方程式,您将获得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表达式,但我不知道如何将其压缩,以便我的递归不会受到伤害。

我非常感谢任何帮助。

0 个答案:

没有答案