计算平均值 (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 中某个日期范围内的缺失数据的主要内容,如果未能解决你的问题,请参考以下文章

计算学员的考试总成绩以及平均成绩

计算学员的考试总成绩以及平均成绩

25.AVG 函数

SQL AVG 函数

SQL AVG 函数

SQL 平均值的计算