繁体   English   中英

BigQuery 减去数组中的元素

[英]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 标准 SQL

#standardSQL
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, 
  ABS(some_numbers[OFFSET(0)] - some_numbers[OFFSET(1)]) diff
FROM sequences   

与 output

在此处输入图像描述

作为已经发布以进一步为社区做出贡献的答案的替代方案,我建议在 BigQuery 中使用用户定义函数 (UDF)

此资源允许您在SQLJavaScript中创建函数,它们接受输入列并执行操作,并在转换后返回所需的结果。 我还要补充一点,如果需要,它们很容易修改(例如,从总和到减法 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM