Javascript JS UDF,带有来自bigquery标准sql的输入数据分区

Javascript JS UDF,带有来自bigquery标准sql的输入数据分区,javascript,google-bigquery,user-defined-functions,Javascript,Google Bigquery,User Defined Functions,我试图将两组按字段id划分的现金流传递给js udf IRRCalc,并为每个现金流集计算一个IRR数 CREATE TEMPORARY FUNCTION IRRCalc(cash_flow ARRAY<FLOAT64>, date_delta ARRAY<INT64>) RETURNS FLOAT64 LANGUAGE js AS """ min = 0.0; max = 100.0; iter_cnt = 0;

我试图将两组按字段id划分的现金流传递给js udf IRRCalc,并为每个现金流集计算一个IRR数

  CREATE TEMPORARY FUNCTION IRRCalc(cash_flow ARRAY<FLOAT64>, date_delta ARRAY<INT64>)
    RETURNS FLOAT64
    LANGUAGE js AS """
      min = 0.0;
      max = 100.0;
      iter_cnt = 0;
      do {
        guess = (min + max) / 2;
        NPV = 0.0;
        for (var j=0; j<cash_flow.length; j++){
          NPV += cash_flow[j]/Math.pow((1+guess),date_delta[j]/365);
        }
        if (cash_flow[0] > 0){
          if (NPV > 0){
            max = guess;
          }
          else {
            min = guess;
          }
        }
        if (cash_flow[0] < 0){
          if (NPV > 0){
            min = guess;
          }
          else {
            max = guess;
          }
        }
        iter_cnt = iter_cnt+1;
      } while (Math.abs(NPV) > 0.00000001 && iter_cnt<8192);
      return guess;

    """;
WITH Input AS
 (
  select
    id,
    scenario_date,
    cash_flow_date,
    date_diff(cash_flow_date, min(cash_flow_date) over (partition by id),day) as date_delta,
    sum(cash_flow) as cash_flow
  from cash_flow_table
  where id in ('1','2')
  group by 1,2,3
  order by 1,2,3
 )

 select 
    id, 
    IRRCalc(array(select cash_flow from input), array(select date_delta from input)) as IRR
 from input
 group by 1
理想情况下,我希望输出表如下所示:

Row id  IRR  
1   1   3.2
2   2   0.8 
然而,我得出的结论如下:

Row id  IRR  
1   1   3.8
2   2   3.8 
我认为问题来自于我调用IRRCalc时,所有内容都放在一个数组中,而不是按id进行分区。如果运行以下命令,您将看到我的意思:

 select 
    array(select cash_flow from input), 
    array(select date_delta from input)
 from input

从输入中选择日期增量,而不是IRRCALARRAYSELECT cash\ U flow from input。在将其传递给函数IRRCalc之前,请有人看一下并告诉我如何在两个数组cash\u flow和date\u delta上应用按id划分的逻辑吗?

下面是您要查找的最外部select语句

SELECT 
  id, 
  IRRCalc(ARRAY_AGG(cash_flow), ARRAY_AGG(date_delta)) AS IRR
FROM input
GROUP BY id 
它按id分组并形成各自的数组,这些数组被传递给您的UDF,所以结果是特定于id的
假设WITHINPUT AS的逻辑是正确的-您应该会得到预期的结果

下面是您要查找的大多数外部select语句

SELECT 
  id, 
  IRRCalc(ARRAY_AGG(cash_flow), ARRAY_AGG(date_delta)) AS IRR
FROM input
GROUP BY id 
它按id分组并形成各自的数组,这些数组被传递给您的UDF,所以结果是特定于id的
假设输入的逻辑是正确的,你应该像往常一样得到预期的结果

——如果有帮助的话,考虑接受和投票——它应该是:OAS总是考虑如果它有帮助,就接受和投票。