【问题标题】:calculate average in separate column over period and group by date Standard SQL BigQuery在不同的列中计算平均值并按日期分组标准 SQL BigQuery
【发布时间】:2022-02-19 02:33:27
【问题描述】:

我在 BQ 中有一张桌子,如下所示:

date          rate 
02/02/22       null
02/01/22       null
01/31/22        1
01/30/22        1.5
01/29/22        0.5

我想创建avg_rate 列。我尝试了简单的平均值计算,但因为我有一个 group by 语句——它将空值分配给 avg_rate 列。我需要每个比率为空的日期来获取所有非空的比率总和并除以行数(对于那些比率不为空的)并将这个数字分配给每个日期。 这是我的查询:

SELECT
  date,
  SUM(rate) / COUNT(*) AS avg_rate
FROM
  `my_table`
GROUP BY
  1

我得到的输出:

date          avg_rate 
02/02/22       null
02/01/22       null
01/31/22        1
01/30/22        1.5
01/29/22        0.5

期望的输出是:

date          avg_rate 
02/02/22        1
02/01/22        1
01/31/22        1
01/30/22        1.5
01/29/22        0.5

【问题讨论】:

  • 2.66666从何而来?
  • 嗯,这是我拥有的这三个值的平均值。公式在查询中。
  • 我在计算中又添加了一个日期,现在已在问题中修复。谢谢!

标签: sql date google-bigquery average group


【解决方案1】:

您可以使用coalesce 返回按日期分组的avg,如果是null,则使用子查询返回列的总平均值:

select date, coalesce(avg(rate), (select avg(rate) from my_table))
from my_table
group by date

【讨论】:

    【解决方案2】:

    假设你有这个:

    SELECT *
    FROM (
      select 1 as i union select 2 union select null
    ) x;
    

    这将输出:

    i
    1
    2
    NULL

    添加了一些聚合函数:

    select avg(i), count(i), sum(i), count(*) 
    from (
       select 1 as i union select 2 union select null
    ) x;
    

    输出是:

    avg(i) count(i) sum(i) count(*)
    1.5000 2 3 3
    • 如您所见,count(i) 计算非空值
    • count(*) 计算所有值

    【讨论】:

    • 但是当还有日期列时我该如何应用它呢?问题是查询必须按天分组,否则我的数据既没有分组也没有聚合的错误。
    • 当没有提供GROUP BY 时,所有记录都归为一个,而GROUP BY-ed 具有什么类型的列并不重要。我的回答只是展示AVG()COUNT()SUM()m 的基础知识,因为在您的问题中您说:“我想创建 avg_rate 列”
    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 2014-06-04
    • 1970-01-01
    • 2014-12-28
    • 2020-07-24
    • 2021-03-22
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多