SQL中偏移每行的Sumproduct

SQL中偏移每行的Sumproduct,sql,google-bigquery,sumproduct,Sql,Google Bigquery,Sumproduct,我正在将一些计算从GoogleSheets迁移到BigQuery,需要编写一个SUMPRODUCT脚本来抵消每一行 这是谷歌表单中的数据。列_1、列_2已给出,SUMPRODUCT是一个计算: Column_1 Column_2 SUMPRODUCT 0 1 0 5 0 10 0 1 0 5 0 5 第1列从单元格A1开始 每行的SUMPRODUCT公

我正在将一些计算从GoogleSheets迁移到BigQuery,需要编写一个SUMPRODUCT脚本来抵消每一行

这是谷歌表单中的数据。列_1、列_2已给出,SUMPRODUCT是一个计算:

Column_1 Column_2 SUMPRODUCT
   0         1        0
   5         0        10
   0         1        0
   5         0        5
第1列从单元格A1开始

每行的SUMPRODUCT公式如下所示:

=SUMPRODUCT(A2:A5,$B$2:$B$5)
=SUMPRODUCT(A3:A6,$B$2:$B$5)
=SUMPRODUCT(A4:A7,$B$2:$B$5)
=SUMPRODUCT(A5:A8,$B$2:$B$5)
在Biquery中,我可以使用SELECT SUM(列_1*列_2)作为表_1中的SUMPRODUCT创建第一个SUMPRODUCT行


在此之后,偏移每行的第1列数组是一项挑战。我的最终数据集将有500多行需要这样做。我还尝试在SQL中偏移函数,但遇到了错误。

下面是针对BigQuery标准SQL的

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 0 pos, 0 Column_1, 1 Column_2 UNION ALL
  SELECT 1, 5, 0 UNION ALL
  SELECT 2, 0, 1 UNION ALL
  SELECT 3, 5, 0 
), b AS (
  SELECT pos, Column_2 FROM `project.dataset.table`
)
SELECT 
  pos, Column_1, Column_2,
  (SELECT SUM(Column_1 * Column_2)
    FROM UNNEST(a) WITH OFFSET AS pos
    JOIN b USING(pos)  
  ) SUMPRODUCT
FROM (
  SELECT *, 
    ARRAY_AGG(Column_1) OVER(ORDER BY pos ROWS BETWEEN CURRENT ROW AND 3 FOLLOWING) a
  FROM `project.dataset.table` t
)
结果

Row pos Column_1    Column_2    SUMPRODUCT   
1   0   0           1           0    
2   1   5           0           10   
3   2   0           1           0    
4   3   5           0           5    

正如您从上面所看到的——您必须有一些字段将在工作表中扮演行号的角色——在我的回答中,我使用了
pos
列作为示例

作为与@Mikhail的回答稍有不同的方法,您可以使用BigQuery中提供的基于JS的外部UDF来简化这些任务:

CREATE TEMP FUNCTION sumproduct(column_1 array<int64>, column_2 array<int64>)
RETURNS int64
LANGUAGE js AS """
  output = 0;
  for (var i=0; i<column_1.length; i++){
     output += (column_1[i]*column_2[i]);
  }
  return output;
""";

with sumproducts as (
  select 
     row_number() over () as idx, 
     sumproduct(aggs, b) as sp from (
        select 
           array_agg(column_1) over (order by idx rows between current row and 3 following) aggs, 
           array_agg(column_2) over () b 
        from (
           select row_number() over () as idx, column_1, column_2 from `dataset.table`
        )
     )
),
items as (
   select row_number() over() as idx, column_1, column_2 from `dataset.table`
)

select r.column_1, r.column_2, spd.sp from items r join sumproducts spd on r.idx = spd.idx
创建临时函数sumproduct(列1数组、列2数组)
返回int64
语言js为“”
输出=0;
对于(var i=0;i