[英]BigQuery subtract elements in array
我想知道如何通过从较大的值中减去较小的值来计算 arrays 中只有两个元素的元素之间的差异。
我首先参考了 BQ 文档 ( https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays#arrays_and_aggregation ) 中的代码示例,并进行了一些我自己的调整,只留下 2 个元素arrays。 我知道这个例子是针对 SUM 的,但我想知道是否有办法修改它来计算差异。
WITH sequences AS
(SELECT [0, 5] AS some_numbers
UNION ALL SELECT [2, 32] AS some_numbers
UNION ALL SELECT [5, 10] AS some_numbers)
SELECT some_numbers,
(SELECT SUM(x)
FROM UNNEST(s.some_numbers) x) AS sums
FROM sequences s;
这些是我想要的结果。
+--------------------+------+
| some_numbers | diff |
+--------------------+------+
| [0, 5] | 5 |
| [2, 32] | 30 |
| [5, 15] | 10 |
+--------------------+------+
作为已经发布以进一步为社区做出贡献的答案的替代方案,我建议在 BigQuery 中使用用户定义函数 (UDF) 。
此资源允许您在SQL或JavaScript中创建函数,它们接受输入列并执行操作,并在转换后返回所需的结果。 我还要补充一点,如果需要,它们很容易修改(例如,从总和到减法 function)。 你可以在这里阅读更多关于它的信息。
我使用 JavaScript 创建了一个 UDF,如下所示:
CREATE TEMP FUNCTION
sub_arr (arr ARRAY<int64>)
RETURNS int64
LANGUAGE js AS '''
arr_sub=0
for(var i = 0; i < arr.length; i++){
arr_sub = parseInt(arr[i]) - arr_sub ;
};
return arr_sub;
''';
#Sample data
WITH
data AS (
SELECT [2, 7] AS some_array UNION ALL
SELECT [10, 32] AS some_array UNION ALL
SELECT [15,20] AS some_array )
#query using the UDF
SELECT sub_arr(some_array) AS result_diff
FROM data
和 output,
我想指出您必须指定将在 function 中使用的数组类型,在本例中为ARRAY<int64>
。 此外,根据文档Javascript 的 UDF不接受INT64
作为返回类型,它转换为FLOAT64
,注意您使用的数据类型是一个好习惯。
只是减法怎么样?
WITH sequences AS (
SELECT [0, 5] AS some_numbers union all
SELECT [2, 32] AS some_numbers union all
SELECT [5, 10] AS some_numbers
)
select some_numbers,
some_numbers[ordinal(2)] - some_numbers[ordinal(1)]
from sequences;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.