テーブル ID Val -- --- 1 10 1 30 1 60 1 90 2 10 2 60 2 90 3 10 3 90 4 50 IDごとのValの平均を求める ただし、IDごとのレコード数が3件以上だったら 最大値と最小値は対象外とする。 また、テーブルに重複したレコードは存在しないものとする。 出力結果 ID 平均 -- ---- 1 45 (30+60)/2 2 60 3 50 (10+90)/2 4 50
select ID, case when count(*) >= 3 then (sum(Val) - max(Val) - min(Val)) / (count(*)-2) else avg(Val) end as 平均 from (select 1 as ID,10 as Val from dual union select 1,30 from dual union select 1,60 from dual union select 1,90 from dual union select 2,10 from dual union select 2,60 from dual union select 2,90 from dual union select 3,10 from dual union select 3,90 from dual union select 4,50 from dual) group by ID order by ID;
count関数で件数を取得して分岐させてます。