Выбрать определенное количество случайных рядов, принадлежащих разным таблицам, в один результирующий набор? - PullRequest
0 голосов
/ 19 марта 2012

См. Таблицы: http://i.stack.imgur.com/4FitK.png

Может ли кто-нибудь помочь мне с построением запроса, который будет выбирать случайные вопросы на основе категории и уровня сложности, а также общего количества вопросов, заданных в конфигурации набора вопросов. Таблица.

Я построил один.

SELECT c.question_id
, s.question_set_id 
FROM qm_question_category c
, qm_question_set_cfg s
WHERE ( c.category_id = s.category_id 
AND c.difficulty_level = s.difficulty_level
) 
AND ROWNUM <= (SELECT SUM(total_questions) 
FROM qm_question_set_cfg 
WHERE question_set_id = 101138) /* Set ID */
ORDER BY dbms_random.value 

Это выбирает общее количество вопросов случайным образом из существующих вопросов на основе категорий и уровня сложности.

Но я хочу сначала выбрать вопросы в каждой категории + сложности случайным образом, а затем объединить эти строки в один набор результатов. (Например, 10 вопросов случайным образом из категории 1, 10 из категории 2 до 10 из категории N, как указано в конфигурации набора вопросов)

1 Ответ

0 голосов
/ 19 марта 2012

Попробуйте использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...