Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
Google bigquery 使用联接选择的查询出现BigQuery内部错误_Google Bigquery - Fatal编程技术网

Google bigquery 使用联接选择的查询出现BigQuery内部错误

Google bigquery 使用联接选择的查询出现BigQuery内部错误,google-bigquery,Google Bigquery,我目前正在做一些非常类似的事情,如下所示: 我目前的查询是: SELECT a.x, a.y, a.z, COALESCE(a.z - b.z,0) AS diff FROM [bla] AS a LEFT JOIN EACH [bla] AS b ON b.x=a.x AND b.y = (SELECT MAX(y) FROM [bla] WHERE x = a.x AND y < a.y) 但是,我最终出现以下错误: 错误:发生内部错误,请求无法完成 这个错误并没有真正的帮助,我不

我目前正在做一些非常类似的事情,如下所示:

我目前的查询是:

SELECT a.x, a.y, a.z, COALESCE(a.z - b.z,0) AS diff
FROM [bla] AS a
LEFT JOIN EACH
[bla] AS b
ON b.x=a.x
AND b.y = (SELECT MAX(y) FROM [bla] WHERE x = a.x AND y < a.y)
但是,我最终出现以下错误:

错误:发生内部错误,请求无法完成


这个错误并没有真正的帮助,我不知道这里出了什么问题。问题似乎是SELECT子查询的最后一个ON语句。

我不知道内部错误的具体原因,但请注意,BigQuery中的连接条件必须是等式的连接,例如a.x=b.x和a.y=b.y。不能在连接条件中放入常量、不等式或子查询


此外,我不鼓励在BigQuery中使用自连接,因为它们通常会导致性能问题。看起来你想找到任何给定x的最大y?如果是这样的话,您可能可以使用分析函数来代替,例如,MAXy被x过度分割?

我不知道内部错误的具体原因,但请注意,BigQuery中的连接条件必须是等式的连接,例如,a.x=b.x和a.y=b.y。您不能在连接条件中放入常量、不等式或子查询


此外,我不鼓励在BigQuery中使用自连接,因为它们通常会导致性能问题。看起来你想找到任何给定x的最大y?如果是这样的话,您可能可以使用分析函数来代替,例如,使用上述链接中的数据,MAXy超额分配x?

: BigQuery的解决方案如下所示

SELECT SN, Date, COALESCE(ROUND(Value - NextValue, 2), 0) as consumption 
FROM ( 
    SELECT *, LAG(Value, 1) OVER (PARTITION BY SN ORDER BY Date) as NextValue 
    FROM temp.EnergyLog)
ORDER BY SN, Date
现在,下面是尝试用[bla]表编写它:

SELECT x, y, z, COALESCE(ROUND(z - Nextz, 2), 0) as diff 
FROM ( 
    SELECT *, LAG(z, 1) OVER (PARTITION BY x ORDER BY y) as Nextz 
    FROM temp.bla)
ORDER BY x, y

我认为上面有很好的工作机会-但您可能需要使用上面提到的链接中的数据进行一些额外的调整: BigQuery的解决方案如下所示

SELECT SN, Date, COALESCE(ROUND(Value - NextValue, 2), 0) as consumption 
FROM ( 
    SELECT *, LAG(Value, 1) OVER (PARTITION BY SN ORDER BY Date) as NextValue 
    FROM temp.EnergyLog)
ORDER BY SN, Date
现在,下面是尝试用[bla]表编写它:

SELECT x, y, z, COALESCE(ROUND(z - Nextz, 2), 0) as diff 
FROM ( 
    SELECT *, LAG(z, 1) OVER (PARTITION BY x ORDER BY y) as Nextz 
    FROM temp.bla)
ORDER BY x, y

我认为上述方法很有可能奏效,但您可能需要做一些额外的调整

另一个解决方案是基于最近推出的JS UDF。 它看起来可能比我上面提到的更重,但我也喜欢它,因为它能很好地控制分析逻辑

我怀疑这将是你的实际选择,但从概念上来说,这可能是有用的

例如,从解决方案来看

SELECT SN, Date, ROUND(consumption,2) as consumption FROM 
js( // input table
(SELECT SN, NEST(STRING(Date) + ',' + STRING(Value)) as Metric
FROM temp.EnergyLog GROUP BY SN) ,
// input columns
SN, Metric,
// output schema
"[{name: 'SN', type: 'integer'},
{name: 'Date', type: 'string'},
{name: 'consumption', type: 'float'}]",
// function
"function(r, emit){
  pair = r.Metric.sort(function (a,b) {return a > b;});
  val = pair[0].split(','); Date = val[0];
  emit({SN: r.SN, Date: Date, consumption: 0});
  for (var i=0; i<pair.length -1; i +=1){
    val = pair[i].split(','); Date = val[0]; Value1 = val[1]; 
    val = pair[i+1].split(','); Value2 = val[1];
    emit({SN: r.SN, Date: Date, consumption: Value2 - Value1});
  }
}" 
) ORDER BY SN, Date  
您可以在此处查看UDF文档:

输出将与先前使用LAG建议的解决方案完全相同


希望您能够使用[bla]表将上述代码翻译为您的案例

另一个解决方案基于最近推出的JS UDF。 它看起来可能比我上面提到的更重,但我也喜欢它,因为它能很好地控制分析逻辑

我怀疑这将是你的实际选择,但从概念上来说,这可能是有用的

例如,从解决方案来看

SELECT SN, Date, ROUND(consumption,2) as consumption FROM 
js( // input table
(SELECT SN, NEST(STRING(Date) + ',' + STRING(Value)) as Metric
FROM temp.EnergyLog GROUP BY SN) ,
// input columns
SN, Metric,
// output schema
"[{name: 'SN', type: 'integer'},
{name: 'Date', type: 'string'},
{name: 'consumption', type: 'float'}]",
// function
"function(r, emit){
  pair = r.Metric.sort(function (a,b) {return a > b;});
  val = pair[0].split(','); Date = val[0];
  emit({SN: r.SN, Date: Date, consumption: 0});
  for (var i=0; i<pair.length -1; i +=1){
    val = pair[i].split(','); Date = val[0]; Value1 = val[1]; 
    val = pair[i+1].split(','); Value2 = val[1];
    emit({SN: r.SN, Date: Date, consumption: Value2 - Value1});
  }
}" 
) ORDER BY SN, Date  
您可以在此处查看UDF文档:

输出将与先前使用LAG建议的解决方案完全相同


希望您能够使用[bla]表将上述代码转换为您的案例

否,我想取当前值与按时间排序的下一行值的差值。因此,如果你想象每天有7行,我想从星期二减去星期一的值,然后从星期三减去星期二的值,依此类推。然后滞后和领先是你的朋友。:-看来米哈伊尔的答案明白了!不,我喜欢取当前值与按时间排序的下一行值的差值。因此,如果你想象每天有7行,我想从星期二减去星期一的值,然后从星期三减去星期二的值,依此类推。然后滞后和领先是你的朋友。:-看来米哈伊尔的答案明白了!谢谢。我不知道滞后声明。非常感谢。我不知道滞后声明。