Sql 在Netezza中生成偶数随机范围

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

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 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

这里的关键是告诉系统将随机数四舍五入到最接近的整数值。

您也可以使用Netezza
FLOOR
函数明确限定它:
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