获取 Bigquery 数组中 3 个最大值的平均值

Posted

技术标签:

【中文标题】获取 Bigquery 数组中 3 个最大值的平均值【英文标题】:Get mean of 3 greatest value in a Bigquery Array 【发布时间】:2019-05-13 17:38:42 【问题描述】:

假设我在 Bigquery 中有一个名为 table1 的表,其中 x 和 y 是一个数组,我怎样才能获得每次最大的 3 个 x 和 y 的平均值?谢谢!

表 1:

Time                           x                     y
00:01:00                     -1.05                  1.23
                             1.456                  2.432
                             1.890                  1.456
                             -0.345                 1.356
                             1.2345                 0.9853
                             1.2344                 0.9857
00:02:00                     2.124                  1.3564
                             1.345                  2.4542
                             -0.9823                3.2343
                             1.231                  1.3453

期望:

Time                    avg_x                                  avg_y
00:01:00              (Average of 3 greatest x at 00:01:00)  (Average of 3 greatest x at 00:01:00)
00:02:00              (Average of 3 greatest x at 00:02:00)  (Average of 3 greatest x at 00:02:00)

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
CREATE TEMP FUNCTION avg_array(arr ANY TYPE) AS ((
  SELECT AVG(val) FROM(
    SELECT val FROM UNNEST(arr) val ORDER BY val DESC LIMIT 3)
  )
);
SELECT time, 
  avg_array(x) avg_x,
  avg_array(y) avg_y
FROM `project.dataset.table`   

如果应用于您的示例数据 - 结果是

Row time        avg_x               avg_y    
1   00:01:00    1.5268333333333333  1.748    
2   00:02:00    1.5666666666666669  2.3483     

更通用的版本(如下)允许您传递多少***元素来计算

#standardSQL
CREATE TEMP FUNCTION avg_array(arr ANY TYPE, cnt INT64) AS ((
  SELECT AVG(val) FROM(
    SELECT val, ROW_NUMBER() OVER(ORDER BY val DESC) pos FROM UNNEST(arr) val
  )
  WHERE pos <= cnt
));
SELECT time, 
  avg_array(x, 3) avg_x,
  avg_array(y, 3) avg_y
FROM `project.dataset.table`

【讨论】:

谢谢@Mikhail Berlyant。如果我想在没有第二个最大值的情况下获得每个数组中最大值和第三个最大值的平均值,有什么办法吗? 当然。这就是为什么我给你通用版本 - 只需将 pos &lt;= cnt 更改为 pos in (1,3),显然你可以调整 avg_array 函数来获取不是计数,而是获取要计算平均的元素的列表。希望你可以自己做这个练习:o) 非常感谢!这是我第一次使用一般的sql! 太棒了。很高兴我们提供了帮助!

以上是关于获取 Bigquery 数组中 3 个最大值的平均值的主要内容,如果未能解决你的问题,请参考以下文章

获取数组中元素的最大值最小值平均值总和

java程序,随机产生包含20个元素的数组,求出数组中的最大值,最小值和平均值

从对象数组中获取数据 sql BigQuery

BigQuery:计算每日分区表中的平均值

813. 最大平均值和的分组(Python)

给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数