【问题标题】:Get first N elements from an array in BigQuery table从 BigQuery 表中的数组中获取前 N 个元素
【发布时间】:2020-03-01 22:15:32
【问题描述】:

我有一个数组列,我想获得它的第一个 N 元素(保持数组数据类型)。有什么好方法吗?理想情况下,无需取消嵌套、排名和 array_agg 返回数组。

我也可以这样做(用于获取前 2 个元素):

WITH data AS
(
  SELECT 1001 as id, ['a', 'b', 'c'] as array_1
  UNION ALL
  SELECT 1002 as id, ['d', 'e', 'f', 'g'] as array_1
  UNION ALL
  SELECT 1003 as id, ['h', 'i'] as array_1
)
select *,
       [array_1[SAFE_OFFSET(0)], array_1[SAFE_OFFSET(1)]] as my_result
from data

但显然这不是一个好的解决方案,因为如果某个数组只有 1 个元素,它会失败。

【问题讨论】:

  • 您可以使用ARRAY_LENGTH(array_1)。这将为您提供数组的长度。

标签: sql arrays select google-bigquery


【解决方案1】:

这是一个通用的解决方案,您可以为任何数组类型调用 UDF:

CREATE TEMP FUNCTION TopN(arr ANY TYPE, n INT64) AS (
  ARRAY(SELECT x FROM UNNEST(arr) AS x WITH OFFSET off WHERE off < n ORDER BY off)
);

WITH data AS
(
  SELECT 1001 as id, ['a', 'b', 'c'] as array_1
  UNION ALL
  SELECT 1002 as id, ['d', 'e', 'f', 'g'] as array_1
  UNION ALL
  SELECT 1003 as id, ['h', 'i'] as array_1
)
select *, TopN(array_1, 2) AS my_result
from data

它使用 unnest 和数组函数,听起来你不想使用,但它的优点是足够通用,你可以将任何数组传递给它。

【讨论】:

  • 我不得不说我希望这可以在没有 UDF 的情况下完成,但这肯定有效。
【解决方案2】:

BigQuery 标准 SQL 的另一个选项(使用 JS UDF)

#standardSQL
CREATE TEMP FUNCTION FirstN(arr ARRAY<STRING>, N FLOAT64)
RETURNS ARRAY<STRING> LANGUAGE js AS """ 
  return arr.slice(0, N);
""";
SELECT *, 
  FirstN(array_1, 3) AS my_result
FROM data   

【讨论】:

  • 也可以,感谢您的提示!我选择了另一个答案,因为它不需要 javascript 并且完全保留在 SQL 中。
猜你喜欢
  • 2016-04-25
  • 2011-04-12
  • 2014-09-17
  • 2012-06-21
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
相关资源
最近更新 更多