获取 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 <= cnt
更改为 pos in (1,3)
,显然你可以调整 avg_array 函数来获取不是计数,而是获取要计算平均的元素的列表。希望你可以自己做这个练习:o)
非常感谢!这是我第一次使用一般的sql!
太棒了。很高兴我们提供了帮助!以上是关于获取 Bigquery 数组中 3 个最大值的平均值的主要内容,如果未能解决你的问题,请参考以下文章