计算平均值 (AVG),包括 Redshift DB 中某个日期范围内的缺失数据
Posted
技术标签:
【中文标题】计算平均值 (AVG),包括 Redshift DB 中某个日期范围内的缺失数据【英文标题】:Calculate average (AVG) including missing data in a date range in Redshift DB 【发布时间】:2020-08-13 20:55:50 【问题描述】:考虑我有以下一组数据
s_date | sales
------------+-------
2020-08-04 | 10
2020-08-05 | 20
2020-08-07 | 10
2020-08-08 | 20
2020-08-09 | 10
2020-08-10 | 30
2020-08-11 | 20
2020-08-12 | 10
我想计算每周“销售额”的平均值。请注意,从 2020 年 8 月 3 日开始的那一周,日期 2020 年 8 月 3 日和 2020 年 8 月 6 日的数据缺失。
当我使用 AVG() 函数计算每周平均值时,它会根据可用记录计算平均值。
以下是我正在尝试的查询以及我从中得到的响应。
select trunc(date_trunc('WEEK', s_date)::timestamp) as week, avg(sales)
from test_temp.sales group by week;
结果:
week | avg
------------+-----
2020-08-03 | 14
2020-08-10 | 20
但是,我想计算将 0 作为缺失日期值的平均值。所以平均计算应该使用以下值。
s_date | sales
------------+-------
2020-08-03 | 0
2020-08-04 | 10
2020-08-05 | 20
2020-08-06 | 0
2020-08-07 | 10
2020-08-08 | 20
2020-08-09 | 10
2020-08-10 | 30
2020-08-11 | 20
2020-08-12 | 10
预期结果:
week | avg
------------+-----
2020-08-03 | 10 // Expected value
2020-08-10 | 20
谁能告诉我如何按预期计算平均值?
问候, 保罗
【问题讨论】:
【参考方案1】:求和除以 7:
select trunc(date_trunc('WEEK', s_date)::timestamp) as week, sum(sales) / 7
from test_temp.sales
group by week;
编辑:
要处理最后一周,您可以执行以下操作:
select trunc(date_trunc('WEEK', s_date)::timestamp) as week,
sum(sales) / least(7, current_date - trunc(date_trunc('WEEK', s_date)::timestamp))
from test_temp.sales
group by week;
【讨论】:
我们能否以某种方式对其进行增强,以便它处理上周的可用日期?例如,如果我们在星期二运行这个,上周将只包含 2 天,所以我想要 sum 除以 2。还有一种方法可以重新使用它来计算每月平均数吗?在每月平均计算的情况下,一个月中的天数因月份(30 或 31 天)和年份(2 月、28 或 29 天)而异。以上是关于计算平均值 (AVG),包括 Redshift DB 中某个日期范围内的缺失数据的主要内容,如果未能解决你的问题,请参考以下文章