Генерация случайного числа в каждой строке в Oracle Query

Я хочу выбрать все строки таблицы, за которыми следует случайное число от 1 до 9:

select t.*, (select dbms_random.value(1,9) num from dual) as RandomNumber
from myTable t

Но случайное число одинаково от строки к строке, только отличное от каждого прогона запроса. Как сделать число отличным от строки к строке в одном и том же исполнении?

Ответы

Ответ 1

Что-то вроде?

select t.*, round(dbms_random.value() * 8) + 1 from foo t;

Ответ 2

Сначала я подумал, что это сработает:

select DBMS_Random.Value(1,9) output
from   ...

Однако это не создает равномерного распределения выходных значений:

select output,
       count(*)
from   (
       select round(dbms_random.value(1,9)) output
       from   dual
       connect by level <= 1000000)
group by output
order by 1

1   62423
2   125302
3   125038
4   125207
5   124892
6   124235
7   124832
8   125514
9   62557

Причины очевидны, я думаю.

Я бы предложил использовать что-то вроде:

floor(dbms_random.value(1,10))

Следовательно:

select output,
       count(*)
from   (
       select floor(dbms_random.value(1,10)) output
       from   dual
       connect by level <= 1000000)
group by output
order by 1

1   111038
2   110912
3   111155
4   111125
5   111084
6   111328
7   110873
8   111532
9   110953

Ответ 3

вам не нужен select … from dual, просто напишите:

SELECT t.*, dbms_random.value(1,9) RandomNumber
  FROM myTable t

Ответ 4

Если вы просто используете раунд, то два конечных числа (1 и 9) будут встречаться реже, чтобы получить равномерное распределение целых чисел между 1 и 9, а затем:

SELECT MOD(Round(DBMS_RANDOM.Value(1, 99)), 9) + 1 FROM DUAL