假设您有一个带有多行的反规范化架构,如下所示:
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 的结果,那将更容易,因此客户端不需要加载整个表(4GB)进行排序 - 可以对每个表进行补充实体通过顺序扫描具有相同uuid的行。但是,这样的查询:
SELECT * FROM user_properties ORDER BY uuid;
超出了BigQuery中的可用资源(使用allowLargeResults禁止ORDER BY)。除非我订阅高端机器,否则我几乎无法在BigQuery中对大表(4GB)进行排序。有什么想法吗?
答案 0 :(得分: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
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