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

标签 sql sql-server

我有一张如下表

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/

相关文章:

php - 为什么wpdb插入sql显示错误?

php - mysql查询删除匹配多个字段的记录

sql-server - 大量文本或 excel 数据更快地导入 sql

SQL Server记录字符串匹配后的链接

sql-server - 查找具有两个指定列名的 SQL Server 表

mysql - 公式中省略了最后一条记录

sql - spring.sql.init.schema-locations 不工作

sql - 自动更新查询 SQL

sql-server - SQL Server text、ntext、image 数据类型问题

sql-server - 外键的默认值与 null