如何在 BigQuery 中获取随机整数?

Fel*_*ffa 5 random google-bigquery

我想在 BigQuery 中获取 0 到 9 之间的随机整数。我尝试过经典的

SELECT CAST(10*RAND() AS INT64)
Run Code Online (Sandbox Code Playgroud)

但它产生 0 到 10 之间的数字

添加这个问题作为结果可能会让习惯在大多数其他语言中CAST执行此操作的程序员感到惊讶TRUNC

请注意这种奇怪的结果分布:

在此输入图像描述

Fel*_*ffa 9

2019 年更新:

现在你可以这样做:

SELECT fhoffa.x.random_int(0,10)
Run Code Online (Sandbox Code Playgroud)

关于持久化 UDF 的博客文章


要获得 0 到 n 之间的随机整数(本例中为 9),您需要FLOOR先执行以下操作CAST

SELECT CAST(FLOOR(10*RAND()) AS INT64)
Run Code Online (Sandbox Code Playgroud)

这是因为 SQL 标准没有指定是否CAST应该转换为整数TRUNCROUND转换为浮点数。BigQuery 标准 SQL 实现选择ROUND,因此带有 a 的经典公式CAST将无法按预期工作。请务必指定您想要FLOOR(或TRUNC)随机数,然后CAST(获得 anINT64而不是 a FLOAT)。

从SQL标准来看:

每当将精确或近似数值分配给精确数值位点时,在舍入或截断后保留前导有效数字的其值的近似值将在目标的声明类型中表示。该值被转换为具有目标的精度和小数位数。是否截断或舍入的选择是实现定义的

https://github.com/twitter/mysql/blob/master/strings/decimal.c#L42


Mik*_*ant 6

另一种选择是

SELECT MOD(CAST(10*RAND() AS INT64), 10)
Run Code Online (Sandbox Code Playgroud)