SQL中偏移每行的Sumproduct
我正在将一些计算从GoogleSheets迁移到BigQuery,需要编写一个SUMPRODUCT脚本来抵消每一行 这是谷歌表单中的数据。列_1、列_2已给出,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公
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