另一个解决方案是基于最近引入的 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] 表将上述代码“翻译”到您的案例中