计算期间内单独列中的平均值并按日期分组标准 SQL BigQuery
calculate average in separate column over period and group by date Standard SQL BigQuery
我在 BQ 中有一个 table,看起来像这样:
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
假设你有这个:
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(*)
计算所有值
您可以使用 coalesce
到 return 按日期分组的 avg
,如果是 null
return 列的总平均值,而不是使用一个子查询:
select date, coalesce(avg(rate), (select avg(rate) from my_table))
from my_table
group by date
我在 BQ 中有一个 table,看起来像这样:
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
假设你有这个:
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(*)
计算所有值
您可以使用 coalesce
到 return 按日期分组的 avg
,如果是 null
return 列的总平均值,而不是使用一个子查询:
select date, coalesce(avg(rate), (select avg(rate) from my_table))
from my_table
group by date