我正在使用标准 SQL 和 javascript UDF 在 bigquery 中编写查询,我遇到了错误“错误:语法错误:预期为“<”但得到了“)”;无法解析 [1 处的 CREATE [TEMP] FUNCTION 语句:47]”。下面是命令行。请有人帮忙。非常感谢。
CREATE TEMPORARY FUNCTION IRRCalc(CArray ARRAY)
RETURNS FLOAT64
LANGUAGE js AS """
function IRRCalc(CArray){
min = 0.0;
max = 1.0;
do {
guess = (min + max) / 2;
NPV = 0.0;
for (var j=0; j<CArray.length; j++){
NPV += CArray[j]/Math.pow((1+guess),j);
}
if (NPV > 0){
min = guess;
}
else {
max = guess;
}
} while (Math.abs(NPV) > 0.00000001);
return guess * 100;
}
""";
WITH Input AS
(SELECT [-100, 100, 100, 100, 100, 100] as CArray
UNION ALL
SELECT [-100, 100, 100, 100, 100] as CArray)
SELECT
CArray,
IRRCalc(CArray) as IRR
FROM Input as t;
最佳答案
如错误声明所述:Expected "<" but got ")"
我认为你只是缺少声明中的类型
CREATE TEMPORARY FUNCTION IRRCalc(CArray ARRAY<INT64>)
代替
CREATE TEMPORARY FUNCTION IRRCalc(CArray ARRAY)
顺便说一句,看起来你需要清理你的 JS UDF - 见下文
CREATE TEMPORARY FUNCTION IRRCalc(CArray ARRAY<INT64>)
RETURNS FLOAT64
LANGUAGE js AS """
min = 0.0;
max = 1.0;
do {
guess = (min + max) / 2;
NPV = 0.0;
for (var j=0; j<CArray.length; j++){
NPV += CArray[j]/Math.pow((1+guess),j);
}
if (NPV > 0){
min = guess;
}
else {
max = guess;
}
} while (Math.abs(NPV) > 0.00000001);
return guess * 100;
""";
WITH Input AS
(SELECT [-100, 100, 100, 100, 100, 100] as CArray
UNION ALL
SELECT [-100, 100, 100, 100, 100] as CArray)
SELECT
CArray,
IRRCalc(CArray) as IRR
FROM Input as t
关于javascript - 使用 Javascript UDF 计算 IRR 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49619487/