Możesz korzystać z funkcji okna. Zakładając, że jest to wartość liczbowa:
select cobrand_id, avg(xsum) as median
from (select m.*,
row_number() over (partition by cobrand_id order by xsum) as seqnum,
count(*) over (partition by cobrand_id) as cnt
from tmp_median m
) m
where 2*seqnum in (cnt, cnt + 1, cnt + 2)
group by cobrand_id;
where
klauzula filtruje wiersze do 1 lub 2 dla każdego cobrand_id
(zwróć uwagę na 2*
), więc działa to zarówno dla liczb parzystych, jak i nieparzystych w każdej partycji. Średnia z tych wartości jest wtedy medianą.