with t (ID, CLASS) as (
select 1 , 'A' from dual union all
select 1 , 'A' from dual union all
select 1 , 'A' from dual union all
select 2 , 'A' from dual union all
select 2 , 'B' from dual union all
select 2 , 'B' from dual union all
select 3 , 'C' from dual union all
select 4 , 'C' from dual
)
select * from (
select t.*, row_number() over(partition by id order by null) rn from t
)
where rn <= 2
;
, если вы не укажете порядок, oracle по умолчанию будет возвращать строки случайным образом.