【问题标题】:SQL Query Help - Select non null values for each ID (multiple rows)SQL 查询帮助 - 为每个 ID 选择非空值(多行)
【发布时间】:2018-01-27 14:55:24
【问题描述】:

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

老实说,我不确定这是否可能,但任何建议都会非常感谢

【问题讨论】:

  • 好的,如果有更多选项,您如何选择这些值?例如 ID 3 和属性 CreatedDate?

标签: mysql sql google-bigquery


【解决方案1】:

按您希望唯一的列分组,并使用max() 获取包含每个id 的结果的结果

select ID, max(Address), max(CreatedDate), max(City)
from your_table
group by ID

【讨论】:

  • 太棒了。很快。如此准确
【解决方案2】:

聚合是这里的关键。假设您想要每个组的最大值/最小值(如果存在多个)。查看 ID 3 上的日期列是最小值。

SELECT ID
     , min(address) as Address
     , min(createdDate) as createdDate
     , min(city) as City
FROM table
GROUP BY ID

【讨论】:

    【解决方案3】:

    作为另一种可能性,您可以使用 BigQuery 的 Standard SQL 版本中提供的函数 ARRAY_AGG 来解决这个问题(强烈建议您使用标准)。

    关于查询:

    #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,一旦超过资源的查询将在几秒钟内处理完毕。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2011-05-01
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多