sql - 在 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。同样,我们必须计算。
解决方案
您需要识别组,然后使用窗口函数。用于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;
推荐阅读
- c# - ASP.NET MVC 中的自定义 CustomAuthenticationAttribute 依赖参数
- python - 在python中打印树中的根和孩子
- c - C 将结构传递给回调函数 (Tizen)
- javascript - 如何删除 Instagram 徽标旁边的小黑线?
- c++ - 我无法从文件中读取
- javascript - 为什么 React Component 渲染计数器增加 2?
- javascript - 如何修复未定义的不是对象(评估'firebase.apps.length')
- angular - 部署和托管 Laravel Rest api 以及 Angular App 和 mysql DB
- reactjs - 蚂蚁设计怎么了?从 GitHub 中删除
- firebase - 如何在flutter firebase中进行全文搜索