【问题标题】:BigQuery internal error on query with a join select使用连接选择进行查询时出现 BigQuery 内部错误
【发布时间】:2015-09-04 13:45:55
【问题描述】:

我目前正在做与这里非常相似的事情: MySQL - Subtracting value from previous row, group by

我目前的查询是:

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)

但是,我最终得到以下错误:

Error: An internal error occurred and the request could not be completed.

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

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    使用来自上述链接的数据 - MySQL - Subtracting value from previous row, group by : 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
    

    我认为上面有很好的工作机会 - 但你可能需要做一些额外的调整

    【讨论】:

    • 非常感谢。我不知道 LAG 声明。
    【解决方案2】:

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

    我怀疑这将是您的实际选择,但从概念上讲这可能很有用

    因此,例如,来自MySQL - Subtracting value from previous row, group by 的解决方案是

    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 文档:https://cloud.google.com/bigquery/user-defined-functions

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

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

    【讨论】:

      【解决方案3】:

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

      另外,我不鼓励在 BigQuery 中使用自联接,因为它们通常会导致性能问题。看起来您正试图找到任何给定 x 的最大 y 之类的东西?如果是这样,您也许可以改用分析函数(例如,MAX(y) OVER(PARTITION BY x))?

      【讨论】:

      • 不,我喜欢取当前值与按时间排序的下一行的值的差。因此,如果您想象每天有 7 行,我想从星期一减去星期二的值,然后从星期二减去星期三的值,依此类推。
      • 那么 LAG 和 LEAD 是你的朋友。 :-) 看起来米哈伊尔的回答明白了!
      猜你喜欢
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多