Sql 在Netezza中生成偶数随机范围
Netezza说它的random()函数生成一个介于0.0和0.99999之间的浮点值。。。 我正在尝试生成一个范围内的随机整数(例如,在5到10之间)。互联网告诉我用这样一个等式将分数换算成一个范围内的数字:Sql 在Netezza中生成偶数随机范围,sql,random,netezza,Sql,Random,Netezza,Netezza说它的random()函数生成一个介于0.0和0.99999之间的浮点值。。。 我正在尝试生成一个范围内的随机整数(例如,在5到10之间)。互联网告诉我用这样一个等式将分数换算成一个范围内的数字: select f,count(*) from ( select CAST(5 + random() * (10-5) as INT) as f from table_of_numbers where number between 1 and 5000 ) x gr
select f,count(*) from (
select CAST(5 + random() * (10-5) as INT) as f
from table_of_numbers
where number between 1 and 5000
) x group by 1 order by 1
但是,当我使用该代码时,样本中的极值表示不足:
F计数
5486表达式random()*(10-5)
生成0到4.99999之间的数字。但是,您有6个值(5、6、7、8、9和10)。因此,您的表达式将5个值拆分为6个存储桶
您的代码发现第一个和最后一个都是半满的。显然,cast()
操作是舍入值而不是截断值(我不认为这是ANSI SQL,但它可以解释您观察到的结果)。这掩盖了问题
试试这个:
select CAST(4.5 + random() * (10-5+1) as INT)
在其他数据库中,类似这样的功能应该可以工作:
select CAST(5 + random() * (10-5+1) as INT)
这个稍加修改的查询在我的环境中的一个大表(约7000万行)上生成了从5到10(包括)的随机数的均匀分布:
select f, count(*) from (
select 5 + floor(random() * 5.99)::int as f
from some_big_table
) x group by 1 order by 1;
F COUNT
5 11659920
6 11663534
7 11665070
8 11668845
9 11665256
10 11549193
这里的关键是告诉系统将随机数四舍五入到最接近的整数值。您也可以使用NetezzaFLOOR
函数明确限定它:FLOOR(random()*6)+5
将为您提供非常均匀的数字5到10的随机分布。
select f, count(*) from (
select 5 + floor(random() * 5.99)::int as f
from some_big_table
) x group by 1 order by 1;
F COUNT
5 11659920
6 11663534
7 11665070
8 11668845
9 11665256
10 11549193