2016-10-04 45 views
2

我想爲我的表中的每個用戶(在Google BigQuery中)選擇不同的列值。我想過用ARRAY_AGG()喜歡:使用ARRAY_AGG()與輸入中的所有空值

SELECT user_id, ARRAY_AGG(DISTINCT field1) AS f1, ARRAY_AGG(DISTINCT field2) AS f2 
FROM t GROUP BY user_id 

但因爲某種user_id S IN field1field2是空的所有值,我收到此錯誤信息:Array 'f1' cannot have a null element

我不知道是否有一種變通方法避免這種錯誤,或者一個不同的方式來實現的結果,而無需使用ARRAY_AGG()

+0

您還可能有興趣在https://code.google.com/ p /谷歌-b igquery/issues/detail?id = 587(它也適用於'ARRAY_AGG')。我在該功能上取得了一些進展,但沒有任何可以宣佈的內容。 –

回答

3

https://cloud.google.com/bigquery/sql-reference/data-types#array-type

如果查詢結果中包含NULL 元素的ARRAY,則BigQuery將引發錯誤,儘管可以在查詢中使用這些ARRAY。

您的查詢在臨時查詢中沒問題,但在結束查詢結果中沒有問題;所以解決方法是,你可以定義你的查詢作爲TMP表,併爲最終結果之前過濾掉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 

移植了一些Postgres的SQL至BigQuery的時候我遇到了同樣的問題,更優雅的解決方案在聚合函數篩選子句,

https://www.postgresql.org/docs/current/static/sql-expressions.html

ARRAY_AGG(f1 FILTER WHEN f1 IS NOT NULL)這是不提供的BigQuery,我真的很希望他們能實現它

+1

如果您有興趣,可以使用具有'ARRAY_AGG'和其他聚合和分析功能的IGNORE NULLS開放的功能請求:https://code.google.com/p/google-bigquery/issues/detail?id=587。語法將類似於'ARRAY_AGG(field1 IGNORE NULLS)AS f1'。 –

2
WITH t1 AS (
    SELECT user_id, ARRAY_AGG(DISTINCT field1) AS f1 
    FROM t WHERE field1 IS NOT NULL 
    GROUP BY user_id 
), 
t2 AS (
    SELECT user_id, ARRAY_AGG(DISTINCT field2) AS f2 
    FROM t WHERE field2 IS NOT NULL 
    GROUP BY user_id 
) 
SELECT t1.user_id, f1, f2 
FROM t1 FULL JOIN t2 
ON t1.user_id = t2.user_id 
相關問題