【问题标题】:Calculate average (AVG) including missing data in a date range in Redshift DB计算平均值 (AVG),包括 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

谁能告诉我如何按预期计算平均值?

问候,
保罗

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案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 天)而异。
    猜你喜欢
    • 2020-12-04
    • 2023-03-26
    • 2020-06-05
    • 2019-06-23
    • 2021-12-29
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多