首页 > 解决方案 > Oracle Lag 函数得出前 3 个月余额的总和

问题描述

我想计算前 3 个月余额的总和。我正在尝试以下代码,但它不起作用。你能帮忙吗

我的数据集

DATE    ID  BAL        
201701  1   1004768.32  
201702  2   1126215.77  
201703  3   1135731.08  
201704  4   1383859.84  
201705  5   1828847.51
201706  6   1520265.46

下面是我用来计算 SUM_PREV_3_MNTH_BAL 的 sql。但是,问题是我得到了前 3 个月的 bal 但不是 SUM

 ROUND(LAG(SUM(BAL), 3) over (partition by ID order by DATE),2) AS SUM_PREV_3_MNTH_BAL. 

我还尝试了以下方法,

ROUND(SUM(lag(BAL,3)) over (partition by ID order by DATE),2) AS SUM_PREV_3_MNTH_BAL-- which is getting below error

ORA-30484: missing window specification for this function
30484. 00000 -  "missing window specification for this function"
*Cause:    All window functions should be followed by window specification,
           like <function>(<argument list>) OVER (<window specification>)

以下是我得到的错误结果。

    DATE    ID      BAL     SUM_PREV_3_MNTH_BAL -- incorrect
    201701  1   1004768.32  
    201702  2   1126215.77  
    201703  3   1135731.08  
    201704  4   1383859.84  1004768.32
    201705  5   1828847.51  1126215.77
    201706  6   1520265.46  1135731.08

我的预期结果如下

    DATE    ID  BAL        SUM_PREV_3_MNTH_BAL--correct
    201701  1   1004768.32  
    201702  2   1126215.77  
    201703  3   1135731.08  
    201704  4   1383859.84  3266715.17
    201705  5   1828847.51  3645806.69
    201706  6   1520265.46  4348438.43

标签: sqloracle

解决方案


您应该在SUM此处使用具有适当窗口的分析函数:

SELECT
    "DATE",
    ID,
    BAL,
    CASE WHEN LAG(BAL, 3) OVER (ORDER BY "DATE") IS NOT NULL
         THEN SUM(BAL) OVER (ORDER BY "DATE" ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING)
         ELSE NULL END AS SUM_PREV_3_MNTH_BAL
FROM yourTable
ORDER BY
    ID;

在此处输入图像描述

演示

我们首先检查表中是否存在 3 个月前的余额。如果没有,那么我们只报告NULL3 个月的总和(这发生在 1 月到 3 月,包括 2017 年)。如果余额确实存在,那么我们取 3 个月的总和。请注意,我们在这里使用的窗口在前面 3 到 1 行之间。


推荐阅读