我有一张如下表
Domain Baseline PlanningPeriod Actual
-------------------------------------------------
Dom 1 Jan 18 1/1/18 10
Dom 1 Jan 18 1/2/18 20
Dom 1 Jan 18 1/3/18 25
Dom 1 Jan 18 1/4/18 24
Dom 1 Feb 18 1/2/18 60
Dom 1 Feb 18 1/3/18 20
Dom 1 Feb 18 1/5/18 40
Dom 1 Feb 18 1/12/18 70
Dom 1 Mar 18 1/3/18 11
Dom 1 Mar 18 1/4/18 12
Dom 1 Mar 18 1/12/18 18
Dom 1 Apr 18 1/4/18 40
Dom 1 Apr 18 1/5/18 25
Dom 1 Apr 18 1/6/18 15
-------------------------------------------------
请注意,也有不同的域
所以我试图获得一个额外的列comulativeactual 按域、基线、计划期分组。
出于以下目的,我做了以下查询
select domain,baseline,planningperiod, actual,sum(actual) over(partition
by domain, baseline order by domain,baseline,planningperiod) as cumilativeactual
幸运的是,它按预期工作并给出了以下结果
Domain Baseline PlanningPeriod Actual CumActual
----------------------------------------------------------------
Dom 1 Jan 18 1/1/18 10 10
Dom 1 Jan 18 1/2/18 20 30
Dom 1 Jan 18 1/3/18 25 55
Dom 1 Jan 18 1/4/18 24 79
Dom 1 Feb 18 1/2/18 60 60
Dom 1 Feb 18 1/3/18 20 80
Dom 1 Feb 18 1/5/18 40 120
Dom 1 Feb 18 1/12/18 70 190
Dom 1 Mar 18 1/3/18 11 11
Dom 1 Mar 18 1/4/18 12 23
Dom 1 Mar 18 1/12/18 18 31
Dom 1 Apr 18 1/4/18 40 40
Dom 1 Apr 18 1/5/18 25 65
Dom 1 Apr 18 1/6/18 15 80
--------------------------------------------------------
但我的要求有点疯狂。我需要每组的最后一个元素作为下一组的第一个元素。但组中的其他值与上述完全相同。所以我真的很困惑如何实现这一目标。我不喜欢游标,因为大约有 20k 条记录。
上述方法应按以下方式工作。
Domain Baseline PlanningPeriod Actual CumActual
----------------------------------------------------------------
Dom 1 Jan 18 1/1/18 10 10
Dom 1 Jan 18 1/2/18 20 30
Dom 1 Jan 18 1/3/18 25 55
Dom 1 Jan 18 1/4/18 24 79
Dom 1 Feb 18 1/2/18 60 **79**
Dom 1 Feb 18 1/3/18 20 80
Dom 1 Feb 18 1/5/18 40 120
Dom 1 Feb 18 1/12/18 70 190
Dom 1 Mar 18 1/3/18 11 **190**
Dom 1 Mar 18 1/4/18 12 23
Dom 1 Mar 18 1/12/18 18 31
Dom 1 Apr 18 1/4/18 40 **31**
Dom 1 Apr 18 1/5/18 25 65
Dom 1 Apr 18 1/6/18 15 80
--------------------------------------------------------
最佳答案
您可以使用 CTE 和 LAG()
as
with cte as
(
select domain,
baseline,
planningperiod,
actual,
sum(actual) over(partition
by domain, baseline order by domain,baseline,planningperiod) as cumilativeactual
from t
)
select domain,
baseline,
planningperiod,
actual,
case when actual = cumilativeactual then
lag(cumilativeactual, 1, 0) over(order by domain,baseline,planningperiod)
else
cumilativeactual end as cumilativeactual
from cte
关于sql - 从每个组中检索列的最后一个元素,并将其用作下一组中同一列的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54129383/