【问题标题】:Generating Random Number In Each Row In Oracle Query在Oracle查询中的每一行中生成随机数
【发布时间】:2009-10-14 20:02:00
【问题描述】:

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

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

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

【问题讨论】:

  • 为了清楚起见,dbms_random.value() 调用只执行一次,因为它所在的 select 在外部 select 之前被评估。

标签: sql oracle


【解决方案1】:

类似的东西?

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

编辑: David 指出这会导致 1 和 9 的分布不均匀。

正如他所指出的,以下给出了更好的分布:

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

【讨论】:

  • dbms_random.value(1,9) 语法仍然正确。只是子查询结构错了
  • 啊,虽然不是均匀分布的值。
  • 谢谢大卫。我认为切换到 trunc 可能会提供更好的分布
【解决方案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

【讨论】:

  • dbms_random.value(1, 10) 可能更正确,因为根据10.2 docs,结果 x 大于或等于第一个参数且小于第二个参数
【解决方案3】:

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

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

【讨论】:

  • 啊,太好了。以及如何生成从 1 到 9 的随机整数而不是浮点数?
  • 使用圆形……啊,太晚了:(
【解决方案4】:

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

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

【讨论】:

  • 获得均匀分布的更简单方法是使用floor
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
相关资源
最近更新 更多