Sql 自服务日起27天内,我们必须对服务单位进行合计

Sql 自服务日起27天内,我们必须对服务单位进行合计,sql,oracle,Sql,Oracle,输入数据: 预期产出: 输入的结果: -->sn-5自2017年8月23日起服务,服务单位为30。所以总和服务单位是30 -->sn-6服务日期为2017年6月9日,服务单位为30。根据第1行起27天,第2行自第1行起的服务期为14天,因此我们 总的来说,服务单位是60 -->从第一行服务日到第三行服务日的差异为29天,因此与第一行服务日到第三行服务日的差异不是27天 总服务单位为30 当我们再次中断27天时,我们需要考虑新的Services OFF日期,所以我考虑了第七行ServFROXO

输入数据:

预期产出:

输入的结果:

-->sn-5自2017年8月23日起服务,服务单位为30。所以总和服务单位是30

-->sn-6服务日期为2017年6月9日,服务单位为30。根据第1行起27天,第2行自第1行起的服务期为14天,因此我们 总的来说,服务单位是60

-->从第一行服务日到第三行服务日的差异为29天,因此与第一行服务日到第三行服务日的差异不是27天 总服务单位为30

当我们再次中断27天时,我们需要考虑新的Services OFF日期,所以我考虑了第七行ServFROXORD日期。像我们一样聪明 我得计算一下


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

将您的输入和预期输出以文本而不是图像的形式发布,花些时间用简单的英语解释您的问题,最好也发布您自己尝试过的内容。选择DISTINCT INL1.*,ceilINL1.SERV_FROM_DATE-INL1.MIN_SERV_FROM_DATE+1/28 ceil_cnt,INL1.SERV_UNIT_cnt as SERV___cnt,suminl1.serv\u uniT\u cnt通过inl1.src\u mbr\u id分区,ROUNDINL1.serv\u FROM\u DATE-inl1.MIN\u serv\u FROM\u DATE+1/28 sum\u serv\u uniT\u cnt FROM SELECT res.*,MINres.SERV_FROM_DATE由res.SRC_MBR_ID由TMP_QRY157929_KX超额支付MINres.SERV_FROM_DATE自TMP_QRY157929_KX>输入数据:SN SRC_MBR_ID MEDCLM_KEY CALENDAR_进程从日期服务单元CNT 5 022502303 32761925957 9/9/2017 8/23 30.00 6 022503 3279117670 9/2017 9 30.007 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\u MBR\u ID MEDCLM\u关键日历\u流程\u日期服务单元\u CNT 5 022503 32761925957 9/2017 8/23 30.006 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自服务日起27天内,我们必须对服务单位进行合计
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
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;