Попробуйте использовать order by
следующим образом:
order by rank() over (partition by c.category_id order by dbms_random.value)
То, что я пытаюсь сделать, - это случайный порядок записей записей для каждой категории по отдельности, а затем упорядочить ее так, чтобы она была-
category a
category b
category c
category a
category b
category c
...
так что теперь вы можете получить 30 записей и быть уверенным, что у вас есть 10 из категории a, 10 из категории b и 10 из категории c
ОБНОВЛЕНИЕ после прочтения вашего комментария я понял, что вы можете искать что-то вроде этого:
select *
from (select c.question_id,
c.category_id,
s.set_id,
s.no_of_questions,
rank() over(partition by c.category_id order by dbms_random.value) rank
from question_category c, question_set_config s
where c.category_id = s.category_id
and c.difficulty_level = s.difficulty_level
and s.set_id = 101138) t
where rank <= t.no_of_questions
Я использовал аналитическую функцию rank (), чтобы дать "номер строки" каждому случайному вопросу в своей категории.Тогда я мог бы запросить только тех, кто меньше, чем no_of_questions