2016-03-04 3 views
2

Предположим, у вас есть де-нормированный схемы с несколькими строками, как показано ниже:Как объединить несколько строк в один в BigQuery?

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

Тот же набор свойств для всех строк, не обязательно отсортирован. Как создать таблицу, такие как использование BigQuery (т.е. нет клиента):

Таблица user_properties:

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

В традиционном SQL есть "STUFF" ключевое слово для этой цели.

Было бы проще, если бы я мог, по крайней мере получить результаты, заказанные UUID поэтому клиент не должен был бы загрузить всю таблицу (4 Гб) для сортировки - это было бы возможно гидрат каждый объект путем сканирования последовательно строки с одинаковыми uuid. Однако запрос, как это:

SELECT * FROM user_properties ORDER BY uuid; 

превышает доступные ресурсы в BigQuery (с использованием allowLargeResults запрещает ORDER BY). Похоже, я не могу сортировать большую таблицу (4 ГБ) в BigQuery, если я не подписался на высокопроизводительную машину. Есть идеи?

ответ

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