gpt4 book ai didi

sql - 从每个组中检索列的最后一个元素,并将其用作下一组中同一列的第一个元素

转载 作者:行者123 更新时间:2023-12-01 08:45:53 26 4
gpt4 key购买 nike

我有一张如下表

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

Demo

关于sql - 从每个组中检索列的最后一个元素,并将其用作下一组中同一列的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54129383/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com