输入数据:在此处输入图像描述
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
预期输出 :在此处输入图像描述
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 是 8/23/2017,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 所以它与第一行不同不是 27 天serv_from_date所以sum_serv_unit_cnt是30岁。
---> 一旦我们再次打破 27 天,我们需要考虑新的serv_from_date所以我考虑了第 7 行serv_from_date。必须计算。
您需要标识组,然后使用窗口函数。 使用 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;