首页 > 解决方案 > 在 Serv_from_date 后的 27 天内,我们必须对 serv_unit_cnt 求和

问题描述

输入数据: 在此处输入图像描述

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。

---> 从第 1 行 serv_from_date 到第 3 行的天数相差 29,所以它与第 1 行 serv_from_date 相差 27 天,所以 sum_serv_unit_cnt 是 30。

---> 一旦我们再次打破 27 天,我们需要考虑新的 serv_from_date,所以我将其视为第 7 行 serv_from_date。同样,我们必须计算。

标签: sqloracle

解决方案


您需要识别组,然后使用窗口函数。用于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;

推荐阅读