Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql googlebigquery中的阶乘_Sql_Google Bigquery_Factorial - Fatal编程技术网

Sql googlebigquery中的阶乘

Sql googlebigquery中的阶乘,sql,google-bigquery,factorial,Sql,Google Bigquery,Factorial,我需要在Google BigQuery中计算一个变量的阶乘-是否有函数用于此?我在这里的文档中找不到: 此时,我建议的解决方案是计算数字1到100的阶乘,并将其上传为一个表,然后与该表联接。如果你有更好的建议,请告诉我 由于上下文可能显示最佳解决方案,因此在计算时间窗口中随机变量数量事件的泊松概率时,使用阶乘。请参见此处的第一个方程式:尝试下面的公式。快速肮脏的例子 select number, factorial FROM js( // input table (select number

我需要在Google BigQuery中计算一个变量的阶乘-是否有函数用于此?我在这里的文档中找不到:

此时,我建议的解决方案是计算数字1到100的阶乘,并将其上传为一个表,然后与该表联接。如果你有更好的建议,请告诉我


由于上下文可能显示最佳解决方案,因此在计算时间窗口中随机变量数量事件的泊松概率时,使用阶乘。请参见此处的第一个方程式:

尝试下面的公式。快速肮脏的例子

select number, factorial 
FROM js(
// input table
(select number from
(select 4 as number),
(select 6 as number),
(select 12 as number)
),
// input columns
number,
// output schema
"[{name: 'number', type: 'integer'},
{name: 'factorial', type: 'integer'}]",
// function
"function(r, emit){
  function fact(num)
  {
      if(num<0)
       return 0;
      var fact=1;
      for(var i=num;i>1;i--)
        fact*=i;
      return fact;
   }

  var factorial = fact(r.number)

  emit({number: r.number,  factorial: factorial});
}"
)

将Mikhail的答案扩展为一般且正确的,用于计算所有数字1到n的阶乘,其中n<500,以下解决方案成立并可有效计算:

select number, factorial 
FROM js(
// input table
(
  SELECT
    ROW_NUMBER() OVER() AS number, 
    some_thing_from_the_table
  FROM
    [any table with at least LIMIT many entries]
  LIMIT
    100 #Change this to any number to compute factorials from 1 to this number
),
// input columns
number,
// output schema
"[{name: 'number', type: 'integer'},
{name: 'factorial', type: 'float'}]",
// function
"function(r, emit){
  function fact(num)
  {
      if(num<0)
       return 0;
      var fact=1;
      for(var i=num;i>1;i--)
        fact*=i;
      return fact;
   }

  #Use toExponential and parseFloat to handle large integers in both Javascript and BigQuery
  emit({number: r.number,  factorial: parseFloat(fact(r.number).toExponential())});
}"
)

如果直接方法适用于您需要计算泊松分布的值,则可以。如果你达到了爆炸的程度,或者给出了不准确的结果,那么请继续阅读数值分析

一般来说,如果对对数进行算术运算,然后将exp作为最终运算,则会获得更好的范围和数值稳定性

你想要:c^k/k!exp-c。 计算它的日志,lnc^k/k!exp-c, i、 e.k lnx-lnk!-C 拿着吧。 但是我们怎么才能得到lnk!没有计算k!?有一个函数叫做gamma函数,它的实际点是它的对数gammaln可以直接近似,lnk!=gammalnk+1


Phil Mainwaring中有一个Javascript gammaln,我还没有测试过,但假设它可以工作,它应该适合您的UDF。

您最多可以得到27个!使用sqludf。高于该值的数值类型将出现溢出错误

CREATE OR REPLACE FUNCTION factorial(integer_expr INT64) AS ( (
    SELECT
      ARRAY<numeric>[ 
      1,
      1,
      2,
      6,
      24,
      120,
      720,
      5040,
      40320,
      362880,
      3628800,
      39916800,
      479001600,
      6227020800,
      87178291200,
      1307674368000,
      20922789888000,
      355687428096000,
      6402373705728000,
      121645100408832000,
      2432902008176640000,
      51090942171709440000.,
      1124000727777607680000.,
      25852016738884976640000.,
      620448401733239439360000.,
      15511210043330985984000000.,
      403291461126605635584000000.,
      10888869450418352160768000000.][
    OFFSET
      (integer_expr)] AS val ) );

  select factorial(10);

您可以很容易地使用java脚本udf来实现这个-。最多100个!这将是一个挑战。BigQUery使用64位整数,这在20之前都很好!但是21岁!已经不适合了。有时人们使用阶乘作为其他事情的构建块,而不是像阶乘那样快速膨胀,例如计算n选择k作为小k。如果你碰巧做了这样的事情,请补充问题,因为这样你可以得到更好的解决办法。@MoshaPasumansky我已经解决了这个问题,不只是100个,而是任何数字。请参阅下面的帖子和评论。关闭!现在在您的示例中插入25对12,您将看到它失败了。我们还想计算所有数字的这个,我们不想一遍又一遍地输入所有数字。使用你的代码作为主干,我已经让它工作了。和以前一样,我添加了它作为一个答案-看看你怎么想!我认为,以这样一种方式提供答案是一种艺术,你可以自己做一些最后的动作,使它完全适合你的情况。我很高兴你得到了这项工作:仍然是选择行号。。。不太通用-您可以对其进行改进,以完全消除任何表的使用,同时仍然生成所需的数字。如果你想看到这一点,让我知道跨平台处理大量数据可能很棘手。诀窍是字符串指数,然后返回浮点。当然,那会很有启发性!但是现在尝试n=500。Javascript浮动是IEEE双精度的,因此它们的范围最多可达2^1024。500! 大约是2^3767。