Если вы хотите включить последний день месяца в группу next , используйте lead()
:
select id,
to_char(next_data_date, 'YYYY-MM') as yyyymm,
sum(GS_PX_AMT)
from (select xxx.*,
lead(data_date, 1, data_date) over (partition by id order by data_date) as next_data_date
from xxx
) x
group by id, to_char(next_data_date, 'YYYY-MM');
Если вы хотите включить последнюю дату и удвойте счет, тогда вы также можете использовать оконные функции:
select id,
to_char(data_date, 'YYYY-MM') as yyyymm,
( sum(GS_PX_AMT) +
sum(case when yyyymm_seqnum = 1 then prev_amt else 0
end)
) as double_counted_sum
from (select xxx.*,
lag(GS_PX_AMT) over (partition by id order by data_date) as prev_amt,
row_number() over (partition by id, to_char(next_data_date, 'YYYY-MM') order data_date) as yyyymm_seqnum
from xxx
) x
group by id, to_char(data_date, 'YYYY-MM');