2016-03-04 42 views
2

假設你有一個多行的非歸架構如下圖所示:如何在BigQuery中將多行聚合爲一行?

uuid | property | value 
------------------------------------------ 
    abc  | first_name | John 
    abc  | last_name | Connor 
    abc  | age   | 26 
... 

同一組的所有行的屬性,不一定排序。 如何創建一個表,例如使用大量查詢(即,沒有客戶端):

表user_properties:

uuid | first_name | last_name | age 
-------------------------------------------------------- 
    abc  | John   | Connor  | 26 

在傳統的SQL存在用於此目的的「東西」關鍵字。

,如果我能至少獲得通過UUID訂購的結果會更容易些,所以客戶端不需要加載整個表(4GB)排序 - 這將有可能通過掃描順序來滋潤每個實體與uuid相同的行。然而,這樣的查詢:

SELECT * FROM user_properties ORDER BY uuid; 

超出了可用資源BigQuery中(使用allowLargeResults禁止ORDER BY)。幾乎看起來我無法在BigQuery中排序大表(4GB),除非我訂閱了高端機器。有任何想法嗎?

回答

6
SELECT 
    uuid, 
    MAX(IF(property = 'first_name', value, NULL)) AS first_name, 
    MAX(IF(property = 'last_name', value, NULL)) AS last_name, 
    MAX(IF(property = 'age', value, NULL)) AS age 
FROM user_properties 
GROUP BY uuid 

另一種選擇 - 無GROUP'ing參與

SELECT uuid, first_name, last_name, age 
FROM (
    SELECT 
    uuid, 
    LEAD(value, 1) OVER(PARTITION BY uuid ORDER BY property) AS first_name, 
    LEAD(value, 2) OVER(PARTITION BY uuid ORDER BY property) AS last_name, 
    value AS age, 
    property = 'age' AS anchor 
    FROM user_properties 
) 
HAVING anchor