3,491
社区成员
发帖
与我相关
我的任务
分享
with tab1 as (
select 'a' ty, 20180101 dt, 100 xq, 0 gj from dual union all
select 'a' ty, 20180201 dt, 100 xq, 0 gj from dual union all
select 'a' ty, 20180301 dt, 100 xq, 0 gj from dual union all
select 'a' ty, 20180401 dt, 100 xq, 0 gj from dual union all
select 'a' ty, 20180501 dt, 100 xq, 0 gj from dual union all
select 'a' ty, 20180601 dt, 100 xq, 0 gj from dual union all
select 'a' ty, 20180701 dt, 100 xq, 0 gj from dual union all
select 'a' ty, 20180801 dt, 100 xq, 0 gj from dual union all
select 'b' ty, 20180101 dt, 80 xq, 0 gj from dual union all
select 'b' ty, 20180201 dt, 80 xq, 0 gj from dual union all
select 'b' ty, 20180301 dt, 80 xq, 0 gj from dual union all
select 'b' ty, 20180401 dt, 80 xq, 0 gj from dual union all
select 'b' ty, 20180501 dt, 80 xq, 0 gj from dual
),
tab2 as (
select 'a' ty, 20171210 dt, 300 in_gj from dual union all
select 'a' ty, 20180410 dt, 150 in_gj from dual union all
select 'b' ty, 20170310 dt, 100 in_gj from dual
),
tab3 as (select t1.*, sum(t1.xq) over(partition by t1.ty order by t1.dt) sum_xq from tab1 t1)
,
tab4 as (select t1.*, sum(t1.in_gj) over(partition by t1.ty order by t1.dt) sum_in_gj from tab2 t1)
,tab5 as (select distinct t1.ty ty1, t1.dt dt1, t1.xq, t1.sum_xq, t2.ty ty2,
dense_rank() over(partition by t1.ty order by t1.dt) dr_1,
max(t2.sum_in_gj) over(partition by t1.ty, t1.dt) mx
from tab3 t1, tab4 t2
where 1 = 1
and t1.ty = t2.ty(+)
and t1.dt >= t2.dt(+)
order by t1.ty, t1.dt
)
,
tab6(ty1, dt1, xq, sum_xq, ty2, dr_1, mx, rev, res) as (
select ty1, dt1, xq, sum_xq, ty2, dr_1, mx, t0.mx - least(t0.xq, t0.mx) rev, least(t0.xq, t0.mx) res
from tab5 t0
where t0.dr_1 = 1
union all
select t1.ty1, t1.dt1, t1.xq, t1.sum_xq, t1.ty2, t1.dr_1, t1.mx,
t2.rev + (t1.mx - t2.mx) - least(t1.xq, t2.rev + (t1.mx - t2.mx)) rev,
least(t1.xq, t2.rev + (t1.mx - t2.mx)) res
from tab5 t1, tab6 t2
where t1.ty1 = t2.ty1
and t1.dr_1 = t2.dr_1 + 1
)
select*from tab6 t1
order by t1.ty1, t1.dt1
;