【问题标题】:Bigquery - Average between columns ignoring NULL valuesBigquery - 忽略 NULL 值的列之间的平均值
【发布时间】:2021-04-13 02:13:30
【问题描述】:

TL;DR:有没有一种简单的方法可以计算 google 的 bigquery 上一组列之间的平均值?

我有一个表格,其中包含来自连续变量的许多估计值,我给出的示例只有三列,但原始表格的内容介于 8 列之间:

Estimate_A Estimate_B Estimate_C
4 2 3
1 2 2
4 NULL 2
2 3 NULL
4 NULL NULL

我想生成一个新列 AVG_ESTIMATE,它是这些估计列之间的 AVERAGE,但忽略 NULL 数据

Estimate_A Estimate_B Estimate_C AVG_ESTIMATE
4 2 3 3
1 2 2 1.66
4 NULL 2 3
2 3 NULL 2.5
4 NULL NULL 4

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    考虑以下解决方案

    select *, 
      (select round(avg(Estimate), 2) 
      from unnest([Estimate_A, Estimate_B, Estimate_C]) Estimate
      ) as AVG_ESTIMATE
    from `project.dataset.table`    
    

    如果应用于您问题中的样本数据 - 输出是

    【讨论】:

      【解决方案2】:

      这无论如何都不是一个优雅的解决方案,但可能会奏效:

      SELECT 
         Estimate_A,
         Estimate_B,
         Estimate_C,
      
      --Add values of each column, divide by number of non-null columns
      
         (
          IFNULL(Estimate_A,0) +
          IFNULL(Estimate_B,0) +
          IFNULL(Estimate_C,0)
         ) 
         / 
         (
          IF(Estimate_A IS NULL, 0,1) + 
          IF(Estimate_B IS NULL, 0,1) + 
          IF(Estimate_C IS NULL, 0,1)
          )  AS AVG_ESTIMATE  
      

      【讨论】:

      • 您可以考虑使用coalesce() 更直接。
      【解决方案3】:

      以下是最通用的解决方案 - 无需引用列名并适用于任意数量的列

      select *, 
        (select round(avg(cast(split(kv, ':')[offset(1)] as float64)), 2)
        from unnest(split(trim(to_json_string(t), '{}'))) kv
        where split(kv, ':')[offset(1)] != 'null'
        ) as AVG_ESTIMATE
      from `project.dataset.table` t    
      

      如果应用于您问题中的样本数据 - 输出是

      下面是上面的稍微重构的版本,只是为了消除一些冗余

      select *, 
        (select round(avg(cast(value as float64)), 2)
        from unnest(split(trim(to_json_string(t), '{}'))) kv,
        unnest([split(kv, ':')[offset(1)]]) value
        where value != 'null'
        ) as AVG_ESTIMATE
      from `project.dataset.table` t  
      

      【讨论】:

        猜你喜欢
        • 2019-03-30
        • 1970-01-01
        • 2021-05-01
        • 2015-03-05
        • 2020-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多