从Serv_from_date起27天内,我们必须对serv_unit_cnt求和

时间:2019-02-08 17:43:15

标签: sql oracle

输入数据: enter image description here

SN  SRC_MBR_ID  MEDCLM_KEY  CALENDAR_PROCESS_DATE   SERV_FROM_DATE  SERV_UNIT_CNT
5   022502303   32761925957 9/9/2017                8/23/2017       30.00
6   022502303   32791176170 9/19/2017               9/6/2017        30.00
7   022502303   32855914080 10/7/2017               9/20/2017       30.00
8   022502303   33301033608 2/9/2018                10/4/2017       30.00
9   022502303   33301033637 2/9/2018                10/4/2017       30.00

预期输出: enter image description here

SN  SRC_MBR_ID  MEDCLM_KEY  CALENDAR_PROCESS_DATE   SERV_FROM_DATE  SERV_UNIT_CNT   sum_serv_unit_cnt
5   022502303   32761925957 9/9/2017                8/23/2017       30.00           30
6   022502303   32791176170 9/19/2017               9/6/2017        30.00           60
7   022502303   32855914080 10/7/2017               9/20/2017       30.00           30
8   022502303   33301033608 2/9/2018                10/4/2017       30.00           60
9   022502303   33301033637 2/9/2018                10/4/2017       30.00           90

输入的结果:

  

---> sn-5 serv_from_date是2017年8月23日,serv_unit_cnt是30。因此sum_serv_unit是30。

     

---> sn- 6 serv_from_date是9/06/2017,serv_unit_cnt是30。根据从第一行开始的27天,第二行serv_from_date秋天是14天,所以我们   必须总结serv_unit_cnt是60。

     

--->从第一行serv_from_date到第三行的天数相差29天,因此与第一行serv_from_date的相差27天,所以   sum_serv_unit_cnt是30。

     

--->一旦我们再次打破27天,我们需要考虑新的serv_from_date,因此我将其视为第七行serv_from_date。像我们一样明智   必须计算。

1 个答案:

答案 0 :(得分:0)

您需要标识组,然后使用窗口功能。使用lag()确定组的起始位置,定义组的累加和,然后确定最终的和:

select t.*,
       sum(SERV_UNIT_CNT) over (partition by SRC_MBR_ID, grp order by SERV_FROM_DATE) as sum_serv_unit_cnt
from (select t.*,
             sum(case when prev_sfd > SERV_FROM_DATE - 14 then 0 else 1 end) over (partition by SRC_MBR_ID order by SERV_FROM_DATE) as grp
      from (select t.*,
                   lag(SERV_FROM_DATE) over (partition by SRC_MBR_ID order by SERV_FROM_DATE) as prev_sfd
            from t
           ) t
      ) t;