我有一张桌子如下
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
-------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
请注意,也有不同的域名
所以我试图获得一个额外的列comulativeactual按域,基线,计划周期分组.
出于此目的,我做了以下查询
select domain,baseline,planningperiod, actual,sum(actual) over(partition
by domain, baseline order by domain,baseline,planningperiod) as cumilativeactual
Run Code Online (Sandbox Code Playgroud)
Fortuantely按预期工作,并给出了以下结果
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
--------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
但我的要求有点疯狂.我需要每个组的最后一个元素作为下一组的第一个元素.但该组中的其他值完全如上所述.所以我真的很困惑如何实现这一目标.我不喜欢光标,因为有大约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
--------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
您可以使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |