Я рекомендую аналитическую функцию, такую как rank () или row_number ().Вы можете сделать это с помощью жестко закодированных союзов, но аналитическая функция сделает всю тяжелую работу за вас.
select *
from
(
select
bt.col_a,
bt.col_b,
bt.process_type_cod,
row_number() over ( partition by process_type_cod order by col_a nulls last ) rank
from small_table st
inner join big_table bt
on st.process_type_cod = bt.process_type_cod
)
where rank < 11
;
Возможно, вам даже не понадобится это объединение, так как в big_table есть все типы, которые вам нужны.В этом случае просто измените условие from на использование big_table и отбросьте объединение.
Для этого выполняется запрос, а затем сортировка записей с использованием оператора order by в операторе partition.Для данной группы (здесь мы сгруппированы по col_a) числовой номер строки (т.е. 1, 2, 3, 4, 5, n + 1 ...) применяется к каждой записи последовательно.Во внешнем предложении where просто отфильтруйте записи по номеру ниже N.