S.M*_* sh 5 sql google-bigquery
我想为我的表中的每个用户选择不同的列值(在 Google BigQuery 中)。我想过使用ARRAY_AGG()像:
SELECT user_id, ARRAY_AGG(DISTINCT field1) AS f1, ARRAY_AGG(DISTINCT field2) AS f2
FROM t GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)
但是因为对于某些user_ids 中的所有值field1或field2为空,我收到此错误消息:Array 'f1' cannot have a null element
我想知道是否有一种解决方法可以避免此错误,或者是否有另一种方法可以在不使用的情况下实现结果 ARRAY_AGG()
Seb*_*eft 14
BigQuery 最终实现了Elliott Brossard的建议,现在您可以执行以下操作:
SELECT user_id, ARRAY_AGG(DISTINCT field1 IGNORE NULLS) AS f1, ARRAY_AGG(DISTINCT field2 IGNORE NULLS) AS f2
FROM t
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)
来自https://cloud.google.com/bigquery/sql-reference/data-types#array-type
如果查询结果具有包含 NULL 元素的 ARRAY,BigQuery 会引发错误,尽管此类 ARRAY 可以在查询内部使用。
您的查询在临时查询中可以,但在最终查询结果中不行;因此,解决方法是您可以将查询定义为临时表并在给出最终结果之前过滤掉 NULL 值:
WITH tmp AS (SELECT user_id,
ARRAY_AGG(DISTINCT field1) AS f1,
ARRAY_AGG(DISTINCT field2) AS f2
FROM t GROUP BY user_id)
SELECT user_id,
ARRAY(SELECT el FROM UNNEST(f1) AS el WHERE el IS NOT NULL) AS f1,
ARRAY(SELECT el FROM UNNEST(f2) AS el WHERE el IS NOT NULL) AS f2
FROM tmp
Run Code Online (Sandbox Code Playgroud)
在将一些 Postgres SQL 移植到 BigQuery 时,我遇到了同样的问题,一个更优雅的解决方案是聚合函数上的 FILTER 子句,
https://www.postgresql.org/docs/current/static/sql-expressions.html
就像ARRAY_AGG(f1 FILTER WHEN f1 IS NOT NULL)BigQuery 中没有的那样,我真的希望他们能够实现它