генерировать 6 чисел от 1 до 2 в соотношении 2: 1 в SQL или PL / SQL - PullRequest
0 голосов
/ 23 апреля 2011

как я могу сгенерировать 6 чисел от 1 до 2, где 4 числа будут 1, а другие 2 будут 2 в случайном порядке, т.е.

результаты

1
2
1
1
1
2

, а также в другом соотношении, например 3: 2: 1 для чисел от 1 до 3 для 12 чисел

т.е.

результаты

1
1
2
3
1
2
1
3
1
1
3
3

результаты должны быть не в таком порядке, а в соотношениях, как указано выше в Oracle SQL или PL / SQL

Ответы [ 2 ]

0 голосов
/ 25 апреля 2011

Чтобы получить идеальные соотношения, вы можете сделать что-то вроде этого - сгенерировать все числа, а затем отсортировать в случайном порядке:

SELECT r
FROM   (SELECT CASE
               WHEN ROWNUM <=4 THEN 1
               ELSE 2
               END AS r
        FROM DUAL
        CONNECT BY LEVEL <= 6)
ORDER BY DBMS_RANDOM.value;

R                      
---------------------- 
2                      
1                      
1                      
2                      
1                      
1                      
0 голосов
/ 24 апреля 2011

Я думаю, что это будет работать в прямом SQL; это ужасно неэффективно, а PL / SQL может быть и не таким. Это также полностью статично; различные соотношения требуют различного числа выбранных значений.

select value
  from (
       select mod(value, 2) + 1 as value, 
              row_number() over (partition by 
                                   case mod(value, 2) = 1 
                                     then 1 
                                     else 0 
                                   end) as twos_row,
              row_number() over (partition by 
                                   case mod(value, 2) = 0
                                     then 1 
                                     else 0 
                                   end) as ones_row
         from (select dbms_crypto.randominteger as value
                 from dba_objects
                order by object_id
              )
       )
 where twos_rows <= 2
    or ones_rows <= 4

Самый внутренний выбор захватывает большой стек случайных чисел. Следующий запрос определяет, будет ли это случайное значение 2 или 1, изменяя раннее случайное значение. Последний уровень вложенности просто отфильтровывает все строки после того, как было возвращено правильное число строк этого типа.

Это непроверенный и хрупкий. Если вам нужно надежное и высокопроизводительное решение, я бы порекомендовал PL / SQL, где вы

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