在Oracle Query中生成每行中的随机数

Sao*_*obi 28 sql oracle

我想选择一个表的所有行,后跟一个介于1到9之间的随机数:

select t.*, (select dbms_random.value(1,9) num from dual) as RandomNumber
from myTable t
Run Code Online (Sandbox Code Playgroud)

但是随机数在行与行之间是相同的,仅与查询的每次运行不同.如何在同一执行中使行数不同?

too*_*kit 46

就像是?

select t.*, round(dbms_random.value() * 8) + 1 from foo t;
Run Code Online (Sandbox Code Playgroud)

编辑:大卫指出这给出了1和9的不均匀分布.

正如他所指出的,以下内容提供了更好的分布:

select t.*, floor(dbms_random.value(1, 10)) from foo t;
Run Code Online (Sandbox Code Playgroud)

  • dbms_random.value(1,9)语法仍然正确.这只是子查询结构的错误 (2认同)
  • 啊,虽然值不是均匀分布的。 (2认同)

Dav*_*dge 16

起初我以为这会起作用:

select DBMS_Random.Value(1,9) output
from   ...
Run Code Online (Sandbox Code Playgroud)

但是,这不会生成输出值的均匀分布:

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
Run Code Online (Sandbox Code Playgroud)

我认为原因很明显.

我建议使用类似的东西:

floor(dbms_random.value(1,10))
Run Code Online (Sandbox Code Playgroud)

因此:

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
Run Code Online (Sandbox Code Playgroud)

  • 根据[10.2 docs](http://docs.oracle.com/cd/),dbms_random.value(1,10)可能更正确,因为x大于或等于第一个参数,小于第二个参数. B19306_01/appdev.102/b14258/d_random.htm#i998095) (2认同)

kni*_*ttl 6

你不需要select … from dual,只需写:

SELECT t.*, dbms_random.value(1,9) RandomNumber
  FROM myTable t
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您只使用 round,那么两个结束数字(1 和 9)的出现频率将降低,以获得 1 和 9 之间整数的均匀分布,然后:

SELECT MOD(Round(DBMS_RANDOM.Value(1, 99)), 9) + 1 FROM DUAL
Run Code Online (Sandbox Code Playgroud)