基于不同日期的红移平均值

时间:2017-06-28 19:26:46

标签: sql amazon-redshift

我有一些如下所示的数据:

2017-06-19  121344.4
2017-06-19  1603435
2017-06-16  53341.3
2017-06-16  980
2017-06-12  2391.8
2017-06-12  1874
2017-05-17  103420.8
2017-05-17  1201
2017-05-16  5075.6
2017-05-16  46341
2017-05-10  1925.4
2017-05-10  170343
2017-04-19  864343.8
2017-04-19  1053245
2017-04-18  434

正如您所看到的,日期的频率各不相同,并且在不同的日期并不一致。我还有一个日期维度表,列出了我在年份和日期加入的所有相关月份的每一天。我想生成一个查询,该查询按天平均为该月的所有日期。这可能吗?我想要的结果是日期,平均值(平均值)

2 个答案:

答案 0 :(得分:0)

如果你想要每天的平均值,你会这样做:

select day, avg(value)
from t
group by day;

如果您还想要累计平均值,假设每天有一个数据值:

select day, avg(value),
       avg(avg(value)) over (order by day range between unbounded preceding and current row)
from t
group by day;

也许其中一个就是你要找的东西。

答案 1 :(得分:0)

逻辑包括以下步骤: 1)获取每天变量的计数和总和 2)离开加入你提到的日历 3)在所需的滚动窗口中计算平均值作为总和/计数(这样你就可以避免平均在数学上不正确的平均值)

with 
daily_summaries as (
    select
     date
    ,count(1)
    ,sum(var)
    from table
    group by 1
)
,summaries_to_calendar as (
    select
     c.month
    ,c.date
    ,s.count as daily_count
    ,s.sum as daily_sum
    from calendar c
    left join daily_summaries s
    on c.date=s.date
)
select
 *
,coalesce(round(1.0*
    sum(daily_sum) over (partition by month order by date rows between  unbounded preceding and current row) /
    sum(daily_count) over (partition by month order by date rows between unbounded preceding and current row)
 ,2),0) as monthly_rolling_avg
from summaries_to_calendar;

这将计算每天回顾直到每月第1天的平均值。如果您的数据集只是问题中的样本,2017-06-11的输出行将为0,2017-06-12它将是2017-06-12 2017-06-12所有条目的平均值-16这将是2017-06-12和2017-06-16所有参赛作品的平均值,依此类推。如果需要,您可以选择不同的窗口,但原理是相同的。