【问题标题】:BigQuery subtract elements in arrayBigQuery 减去数组中的元素
【发布时间】:2020-07-22 14:42:23
【问题描述】:

我想知道如何通过从较大值中减去较小值来计算只有两个元素的数组中元素之间的差异。

我首先参考了 BQ 文档 (https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays#arrays_and_aggregation) 中的代码示例,我自己做了一些调整,只在数组中保留了 2 个元素。我知道这个例子是针对 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   |
+--------------------+------+

【问题讨论】:

  • @MikhailBerlyant 我很抱歉。我知道规则。我打算在选择一个之前通读所有答案,但是我有很多工作要做,最后忘记选择了。

标签: sql arrays google-bigquery


【解决方案1】:

以下是 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   

有输出

【讨论】:

    【解决方案2】:

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

    此资源允许您在 SQL 或 JavaScript 中创建函数,这些函数接受输入列并执行操作,并在转换后返回所需的结果。我还要补充一点,如果需要,它们很容易修改(例如,从求和到减法函数)。你可以阅读更多关于它的信息here。

    我使用 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
    

    和输出,

    我想指出,您必须指定将在函数中使用的数组类型,在本例中为 ARRAY&lt;int64&gt;。此外,根据documentation Javascript 的 UDF 不接受 INT64 作为返回类型,它会转换为 FLOAT64,注意您使用的数据类型是一个好习惯.

    【讨论】:

      【解决方案3】:

      减法怎么样?

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多