sql - 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
解决方案
您应该在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 个月前的余额。如果没有,那么我们只报告NULL
3 个月的总和(这发生在 1 月到 3 月,包括 2017 年)。如果余额确实存在,那么我们取 3 个月的总和。请注意,我们在这里使用的窗口在前面 3 到 1 行之间。
推荐阅读
- encoding - 计算机如何识别二进制中的 0?
- assembly - 谁负责在 /etc/ld.so.preload 中加载文件?
- react-native - 更新初始状态后 Redux 状态未更改
- git - Git 克隆错误“连接后来自代理的 HTTP 代码 405”
- python - 尝试在 python 中运行递归函数,但它会为 v1 和 v2 重新调整非
- linux - /lib/ld-linux-armhf.so.3:没有这样的文件或目录
- c# - 如何避免在我的点网核心代码库中传递 CancellationToken?
- json - 如何在 JMeter 中将 JSON 转换为协议缓冲区?
- ag-grid-angular - 如何防止在 ag-grid 中双击单元格?
- java - 如何在 SpringBootTest 案例中手动将数据刷新到数据库中?