Если я правильно понимаю, вы можете агрегировать в массив, а затем разложить:
select t.*,
(select percentile_cont(earning) over ()
from unnest(ar_earnings) earning
limit 1
) as median_2months
from (select t.*,
array_agg(earnings) over (partition by city
order by month
range between 1 preceding and current month
) as ar_earnings
from t
) t;
Вы не предоставляете образцы данных, но в этой версии предполагается, что month
- это увеличивающееся целое число, которое представляет месяц. Возможно, вам потребуется отрегулировать range
в зависимости от типа.