2015-11-17 87 views
1

我的架構看起來是這樣的:BigQuery中樞軸重複場

userid:string 
timestamp:integer 
params:nested/repeated field with 2 fields 
    - name:string (possible values: "a", "b","c") 
    - value:string 

我希望我的查詢返回如下:

userid, timestamp, a, b, c 
123, 1447799796, foo, bar, xyz 
233, 1447799900, bob, xxx, yyy 
: 
: 

什麼是最簡單的方法是什麼?沿着這些線路

回答

2

時可能的值是預先知道的,有沒有那麼多的人來寫手動SQL - 你可以在下面使用:

SELECT 
    userid, 
    ts, 
    MAX(IF(params.name = "a", params.value, NULL)) WITHIN RECORD a, 
    MAX(IF(params.name = "b", params.value, NULL)) WITHIN RECORD b, 
    MAX(IF(params.name = "c", params.value, NULL)) WITHIN RECORD c 
FROM yourTable 

如果可能的話值是事先「未知」的和/或從運行到運行的動態,您可以使用下面的助手SQL來生成上述類型的SQL。

SELECT 'select userid, ts, ' + 
    GROUP_CONCAT_UNQUOTED(
     'max(if(params.name = "' + STRING(params.name) + '", params.value, null)) 
     WITHIN RECORD as [' + STRING(params.name) + ']' 
    ) 
    + ' from yourTable ' 
FROM (SELECT params.name FROM yourTable GROUP BY params.name) 
+0

感謝Mike,使用SQL標準版本的BigQuery怎麼樣? – Florent

+0

@FlorentCailly - 好問題!自2015年11月以來,發生了很多變化。現在強烈建議使用BigQuery的標準SQL!我很久以前在這裏遷移:)除了當我需要使用快照(仍然可用於傳統SQL) –

+0

感謝Mike,你可以發佈有關如何使用標準SQL執行此操作的更新嗎?出於某種原因,當我使用上述方法並進行彙總時,我得不到正確的結果。如果我使用'FIRST'而不是'MAX',我會得到更接近的結果,但仍然不是正確的結果。 這裏是查詢: – Florent

1

東西:

SELECT 
    userid, 
    timestamp, 
    FIRST(name == "a", value, NULL) WITHIN RECORD a, 
    FIRST(name == "b", value, NULL) WITHIN RECORD b, 
    FIRST(name == "c", value, NULL) WITHIN RECORD c, 
FROM t