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

时间:2009-10-14 20:02:00

标签: sql oracle

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

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

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

4 个答案:

答案 0 :(得分:38)

喜欢什么?

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

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

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

select t.*, floor(dbms_random.value(1, 10)) from foo t;

答案 1 :(得分:15)

起初我认为这样可行:

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

答案 2 :(得分:6)

您不需要select … from dual,只需写下:

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

答案 3 :(得分:3)

如果你只是使用round,那么两个结束数字(1和9)将不那么频繁地出现,以便在1到9之间得到均匀的整数分布:

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