SQL查询帮助 - 为每个ID选择非空值(多行)

时间:2017-08-18 20:44:46

标签: mysql sql google-bigquery

我在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

老实说,我不确定这是否可行,但任何建议都会非常赞赏!

3 个答案:

答案 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,即可在几秒钟内处理超出资源的查询。