[英]SQL Query Help - Select non null values for each ID (multiple rows)
我在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
老实说,我不知道这甚至有可能,但任何建议,将不胜感激!
按要唯一的列分组,并使用max()
获得包含每个id
的结果
select ID, max(Address), max(CreatedDate), max(City)
from your_table
group by ID
聚合是这里的关键。 假设您想要每个组的最大/最小值(如果存在多个)。 查看ID 3上的日期列,这是分钟。
SELECT ID
, min(address) as Address
, min(createdDate) as createdDate
, min(city) as City
FROM table
GROUP BY ID
另一种可能性是,您可以使用BigQuery的Standard SQL版本中提供的功能ARRAY_AGG解决此问题(强烈建议您使用standard)。
至于查询:
#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
,一旦超出资源量的查询将在几秒钟内处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.