我在BigQuery中有一个表,其中每个ID都有多行,其中很多都是Null值。我想组合行来创建一个完整的集合。
以下是一组示例数据:
ID Address CreatedDate City
1 1 1st Street NULL New York City
1 NULL 8/18/17 NULL
2 NULL 8/13/17 Boston
2 2 2nd Street NULL NULL
3 3 3rd Street 8/1/17 Los Angeles
3 NULL NULL NULL
3 NULL 8/7/17 NULL
这是预期的输出:
ID Address CreatedDate City
1 1 1st Street 8/18/17 New York City
2 2 2nd Street 8/13/17 Boston
3 3 3rd Street 8/1/17 Los Angeles
老实说,我不确定这是否可行,但任何建议都会非常赞赏!
答案 0 :(得分:2)
按照您想要唯一的列进行分组,并使用max()
获取包含每个id
的内容的结果
select ID, max(Address), max(CreatedDate), max(City)
from your_table
group by ID
答案 1 :(得分:2)
聚合是关键。假设您希望每个组的最大/最小值(如果存在多个)。查看ID 3上的日期列,它是最小的。
SELECT ID
, min(address) as Address
, min(createdDate) as createdDate
, min(city) as City
FROM table
GROUP BY ID
答案 2 :(得分:0)
作为另一种可能性,您可以使用BigQuery的ARRAY_AGG版本中提供的函数Standard SQL来解决这个问题(强烈建议您使用标准版)。
至于查询:
#standardSQL
SELECT
ID,
ARRAY_AGG(Address IGNORE NULLS LIMIT 1) Address,
ARRAY_AGG(CreatedDate IGNORE NULLS LIMIT 1) CreatedDate,
ARRAY_AGG(City IGNORE NULLS LIMIT 1) City
from
`your_table`
GROUP BY
ID
您可以使用模拟数据进行测试:
#standardSQL
WITH data AS(
SELECT 1 ID, '1 1st Street1' Address, NULL CreatedDate, 'New York City' City UNION ALL
SELECT 1, NULL, '8/18/17', NULL UNION ALL
SELECT 2, NULL, '8/13/17', 'Boston' UNION ALL
SELECT 2, '2 2nd Street', NULL, NULL UNION ALL
SELECT 3, '3 3rd Street', '8/1/17', 'Los Angeles' UNION ALL
SELECT 3, NULL, NULL, NULL UNION ALL
SELECT 3, NULL, '8/7/17', NULL
)
SELECT
ID,
ARRAY_AGG(Address IGNORE NULLS LIMIT 1) Address,
ARRAY_AGG(CreatedDate IGNORE NULLS LIMIT 1) CreatedDate,
ARRAY_AGG(City IGNORE NULLS LIMIT 1) City
from
data
GROUP BY
ID
ORDER BY
ID
您可能会发现,只需正确使用ARRAY_AGG
,即可在几秒钟内处理超出资源的查询。