Můžete použít funkce okna. Za předpokladu, že se jedná o číselnou hodnotu:
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
klauzule filtruje řádky na 1 nebo 2 pro každý cobrand_id
(všimněte si 2*
), takže to funguje pro sudá i lichá čísla v každém oddílu. Průměr těchto hodnot je pak medián.