【发布时间】:2021-04-20 22:22:55
【问题描述】:
我们需要获取 3 个月、一年、三年和五年的数字。 如果最早的 period_end_date 小于 12 个月,则以下查询将为 OneY、ThreeY 和 FiveY 返回 0。 如何更改查询以使其包含一年、三年、五年内的数字? 对于 OneY,如果实体存在的月数少于 12 个月,则将 rt 的 SUM 指定为实体存在的最大月数。
假设实体存在 3 个月:
因此,对于 OneY,分配 rt 3 个月的总和
对于 ThreeY,分配 rt 3 个月的总和
为 FiveY 分配 rt 3 个月的总和
样本数据:
Entity_id Period_end_Date One_Month_value
123 11/30/20 10
123 10/31/20 20
以下查询的当前结果:
ThreeM: 30
OneY: 0
ThreeY: 0
FiveY: 0
预期结果
ThreeM: 30
OneY: 30
ThreeY: 30
FiveY: 30
谢谢。
SELECT SUM (DECODE (rnk, 2, rt, 0)) as ThreeM,
SUM (DECODE (rnk, 11, rt, 0)) as OneY,
SUM (DECODE (rnk, 35, rt, 0)) as ThreeY,
SUM (DECODE (rnk, 59, rt, 0)) as FiveY,
FROM (SELECT entity_id,
rnk,
SUM (one_month)
OVER (PARTITION BY TRIM (entity_id) ORDER BY rnk)
rt
FROM ( SELECT psm.One_Month_Value,
RANK ()
OVER (PARTITION BY TRIM (entity_id)
ORDER BY period_end_date DESC)
AS rnk
FROM myTbl psm
WHERE TRIM (psm.entity_id) = 123
AND period_end_date < '12/31/2020'
ORDER BY period_end_date DESC) rank_tab
WHERE rnk < 60)
WHERE rnk IN (1,2,11,35,59);
【问题讨论】:
-
请用足够的样本数据构建一个 db fiddle,以便我们测试可能的解决方案。
-
嗨,我添加了样本数据、当前结果和预期结果。谢谢!
-
两整行样本数据?
-
@faujong 请不要在问题的编辑中发布答案;如果您想自行回答问题,请将答案作为答案发布。我将回滚您的问题,您可以将其作为答案发布。
标签: sql oracle oracle11g sum partition