WITH
tdr AS (
    SELECT
         DATERANGE('2020-05-01','2021-05-01','[)') drange
        ,DATERANGE('2020-05-01' + ('1 year'::interval),'2021-05-01' + ('1 year'::interval),'[)') repl
        ,'1 year'::interval AS incr
        ,(SELECT jsonb_agg(x.v) FROM (VALUES('copy'),('actuals'),('actuals plug'),('adj price'),('adj volume')) AS x(v)) iter
)
,remove AS (
    SELECT
        -----------documents-------------
        null::int "ddord#"
        ,null::int "dditm#"
        ,null::int "fgbol#"
        ,null::int "fgent#"
        ,null::int "diinv#"
        ,null::int "dilin#"
        ,null::int quoten
        ,null::int quotel
        ----------dates/status------------------
        ,o.odate dcodat
        ,o.rdate ddqdat
        ,null::date dcmdat
        ,null::date fesdat
        ,o.dhidat
        ,null::text fesind
        ,null::text dhpost
        ,o.fspr
        -----------measures--------------------
        ,null::numeric ddqtoi
        ,null::numeric ddqtsi
        ,null::numeric fgqshp
        ,null::numeric diqtsh
        ,null::numeric diext
        ,null::numeric ditdis
        ,null::jsonb discj
        ,null::text dhincr
        ,o.plnt
        ,o.promo
        ,o.return_reas
        ,o.terms
        ,null::text custpo
        ,null::text remit_to
        ,null::text bill_class
        ,o.bill_cust
        ,null::text bill_rep
        ,null::text bill_terr
        ,null::text ship_class
        ,o.ship_cust
        ,null::text ship_rep
        ,null::text ship_terr
        ,o.dsm
        ,null::text account
        ,null::text shipgrp
        ,null::text geo
        ,null::text chan
        ,null::text chansub
        ,null::text orig_ctry
        ,null::text orig_prov
        ,null::text orig_post
        ,null::text bill_ctry
        ,null::text bill_prov
        ,null::text bill_post
        ,null::text dest_ctry
        ,null::text dest_prov
        ,null::text dest_post
        ,o.part
        ,null::text styc
        ,null::text colc
        ,null::text colgrp
        ,null::text coltier
        ,null::text colstat
        ,null::text sizc
        ,null::text pckg
        ,null::text kit
        ,null::text brnd
        ,null::text majg
        ,null::text ming
        ,null::text majs
        ,null::text mins
        ,null::text gldco
        ,null::text gldc
        ,null::text glec
        ,null::text harm
        ,null::text clss
        ,null::text brand
        ,null::text assc
        ,null::text ddunit
        ,null::text unti
        ,null::numeric lbs
        ,null::numeric plt
        ,null::text plcd
        ,o.fs_line
        ,o.r_currency
        ,o.r_rate
        ,o.c_currency
        ,o.c_rate
        ,-sum(o.fb_qty) fb_qty
        ,-sum(o.fb_val_loc) fb_val_loc
        ,-sum(o.fb_val_loc_dis) fb_val_loc_dis
        ,-sum(o.fb_val_loc_qt) fb_val_loc_qt
        ,-sum(o.fb_val_loc_pl) fb_val_loc_pl
        ,-sum(o.fb_val_loc_tar) fb_val_loc_tar
        ,-sum(o.fb_cst_loc) fb_cst_loc
        ,-sum(o.fb_cst_loc_cur) fb_cst_loc_cur
        ,-sum(o.fb_cst_loc_fut) fb_cst_loc_fut
        ,o.calc_status
        ,o.flag
        ,o.odate
        ,o.oseas
        ,o.rdate
        ,o.rseas
        -----when null, greatest/least is just going to act like coalesce
        ,o.sdate
        ,o.sseas
        ,o.version
        ,o.iter
    FROM
        rlarp.osmf_dev o
        CROSS JOIN tdr
    WHERE
        --collect all the rows in the base period and
        --the destination slot for the new rows
        o.odate <@ tdr.drange
        OR o.odate <@ tdr.repl
    GROUP BY
         o.odate
        ,o.rdate
        ,o.dhidat
        ,o.fspr
        ,o.plnt
        ,o.promo
        ,o.return_reas
        ,o.terms
        ,o.bill_cust
        ,o.ship_cust
        ,o.dsm
        ,o.part
        ,o.fs_line
        ,o.r_currency
        ,o.r_rate
        ,o.c_currency
        ,o.c_rate
        ,o.calc_status
        ,o.flag
        ,o.odate
        ,o.oseas
        ,o.rdate
        ,o.rseas
        ,o.sdate
        ,o.sseas
)
,stack AS (
SELECT * FROM rlarp.osmf_stage
UNION ALL 
SELECT * FROM remove
)
,merge_diff AS (
    SELECT
        -----------documents-------------
        null::int "ddord#"
        ,null::int "dditm#"
        ,null::int "fgbol#"
        ,null::int "fgent#"
        ,null::int "diinv#"
        ,null::int "dilin#"
        ,null::int quoten
        ,null::int quotel
        ----------dates/status------------------
        ,o.odate dcodat
        ,o.rdate ddqdat
        ,null::date dcmdat
        ,null::date fesdat
        ,o.dhidat
        ,null::text fesind
        ,null::text dhpost
        ,o.fspr
        -----------measures--------------------
        ,null::numeric ddqtoi
        ,null::numeric ddqtsi
        ,null::numeric fgqshp
        ,null::numeric diqtsh
        ,null::numeric diext
        ,null::numeric ditdis
        ,null::jsonb discj
        ,null::text dhincr
        ,o.plnt
        ,o.promo
        ,o.return_reas
        ,o.terms
        ,null::text custpo
        ,null::text remit_to
        ,null::text bill_class
        ,o.bill_cust
        ,null::text bill_rep
        ,null::text bill_terr
        ,null::text ship_class
        ,o.ship_cust
        ,null::text ship_rep
        ,null::text ship_terr
        ,o.dsm
        ,null::text account
        ,null::text shipgrp
        ,null::text geo
        ,null::text chan
        ,null::text chansub
        ,null::text orig_ctry
        ,null::text orig_prov
        ,null::text orig_post
        ,null::text bill_ctry
        ,null::text bill_prov
        ,null::text bill_post
        ,null::text dest_ctry
        ,null::text dest_prov
        ,null::text dest_post
        ,o.part
        ,null::text styc
        ,null::text colc
        ,null::text colgrp
        ,null::text coltier
        ,null::text colstat
        ,null::text sizc
        ,null::text pckg
        ,null::text kit
        ,null::text brnd
        ,null::text majg
        ,null::text ming
        ,null::text majs
        ,null::text mins
        ,null::text gldco
        ,null::text gldc
        ,null::text glec
        ,null::text harm
        ,null::text clss
        ,null::text brand
        ,null::text assc
        ,null::text ddunit
        ,null::text unti
        ,null::numeric lbs
        ,null::numeric plt
        ,null::text plcd
        ,o.fs_line
        ,o.r_currency
        ,o.r_rate
        ,o.c_currency
        ,o.c_rate
        ,sum(o.fb_qty) fb_qty
        ,sum(o.fb_val_loc) fb_val_loc
        ,sum(o.fb_val_loc_dis) fb_val_loc_dis
        ,sum(o.fb_val_loc_qt) fb_val_loc_qt
        ,sum(o.fb_val_loc_pl) fb_val_loc_pl
        ,sum(o.fb_val_loc_tar) fb_val_loc_tar
        ,sum(o.fb_cst_loc) fb_cst_loc
        ,sum(o.fb_cst_loc_cur) fb_cst_loc_cur
        ,sum(o.fb_cst_loc_fut) fb_cst_loc_fut
        ,o.calc_status
        ,o.flag
        ,o.odate
        ,o.oseas
        ,o.rdate
        ,o.rseas
        -----when null, greatest/least is just going to act like coalesce
        ,o.sdate
        ,o.sseas
        ,'actuals'
        ,'merge'
    FROM
        stack
    WHERE
        --collect all the rows in the base period and
        --the destination slot for the new rows
        o.odate <@ tdr.drange
        OR o.odate <@ tdr.repl
    GROUP BY
         o.odate
        ,o.rdate
        ,o.dhidat
        ,o.fspr
        ,o.plnt
        ,o.promo
        ,o.return_reas
        ,o.terms
        ,o.bill_cust
        ,o.ship_cust
        ,o.dsm
        ,o.part
        ,o.fs_line
        ,o.r_currency
        ,o.r_rate
        ,o.c_currency
        ,o.c_rate
        ,o.calc_status
        ,o.flag
        ,o.odate
        ,o.oseas
        ,o.rdate
        ,o.rseas
        ,o.sdate
        ,o.sseas
)
SELECT COUNT(*) from merge_deff
