MedianTable key seq Val --- --- --- 1 1 50 1 2 100 1 3 150 1 4 200 1 5 250 2 1 300 2 2 350 2 3 400 2 4 450 3 1 500 3 2 550 4 1 600 4 2 650 4 3 700 keyごとの Valのメジアン(中央値)を取得する。 出力結果 key MedianVal --- --------- 1 150 2 375 3 525 4 650
create table MedianTable as select 1 as Key,1 as seq,50 as Val from dual union select 1,2,100 from dual union select 1,3,150 from dual union select 1,4,200 from dual union select 1,5,250 from dual union select 2,1,300 from dual union select 2,2,350 from dual union select 2,3,400 from dual union select 2,4,450 from dual union select 3,1,500 from dual union select 3,2,550 from dual union select 4,1,600 from dual union select 4,2,650 from dual union select 4,3,700 from dual;
--■■■Median関数を使う方法(10g以降)■■■ select Key,Median(Val) as MedianVal from MedianTable group by Key order by Key; --■■■percentile_cont関数を使う方法■■■ select Key,percentile_cont(0.5) within group(order by Val) as MedianVal from MedianTable group by Key order by Key; --■■■分析関数を使う方法■■■ select key,avg(Val) as MedianVal from (select key,Val, count(*) over(partition by key) as RecordCount, Row_Number() over(partition by key order by Val) as Rank from MedianTable) where (mod(RecordCount,2) = 0 and Rank in(RecordCount/2,RecordCount/2+1)) or (mod(RecordCount,2) = 1 and Rank = Ceil(RecordCount/2)) group by key order by key;
Median関数を使う方法が一番分かりやすいでしょうね 2-3-6 メジアン(中央値)を取得 2-3-31 標準SQLでメジアン(中央値)を取得