类似于
with
-- Sample data
contracts(bs_id, start_date, end_date, contract_value) as (values
(1, '2015-01-01'::date, '2017-01-01'::date, 240000),
(1, '2016-01-01'::date, '2016-06-01'::date, 6000)),
spending(bs_id, month, trans_value) as (values
(1, '2015-01-01'::date, 1230.12),
(1, '2015-02-01'::date, 1735.98),
(1, '2016-05-01'::date, 5689.01)),
-- End of sample data
contracts_monthly as (
select
bs_id,
month::date,
sum(
contract_value / (
(extract(year from end_date)*12 + extract(month from end_date)) -
(extract(year from start_date)*12 + extract(month from start_date)))) as monthly_con_val
from contracts, generate_series(start_date, end_date, interval '1 month') as month
group by bs_id, month
order by bs_id, month)
select
*
from
contracts_monthly left join spending using (bs_id, month);
为了使示例更加紧凑,我合并了列
buyer_id | supplier_id
bs_id
.
About
generate_series()
function