输入数据: 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。像我们一样明智 必须计算。
答案 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;