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

Posted

技术标签:

【中文标题】基于不同日期的红移滚动平均值【英文标题】:Rolling average in redshift based on varying dates 【发布时间】:2017-06-28 19:26:45 【问题描述】:

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

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

如您所见,日期的频率各不相同,并且在不同的日期不一致。我还有一个日期维度表,其中列出了我在年份和日期上加入的所有相关月份的每一天。我想生成一个查询,该查询在一个月的所有日子里按天计算。这可能吗?我想要的结果是 Date, avg(value) over days

【问题讨论】:

“我想生成一个查询,根据上一个日期之间的间隔按天计算平均值。”我不明白。也许编辑问题并添加您想要的结果会有所帮助。 ok 做了一些改动 【参考方案1】:

逻辑由以下步骤组成: 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;

这将计算回溯到该月第一天的每一天的平均值。如果您的数据集只是问题中的样本,则 2017-06-11 的输出行将为 0,对于 2017-06-12,它将是 2017-06-12 的所有条目的平均值,对于 2017-06 -16 它将是 2017-06-12 和 2017-06-16 等所有条目的平均值。您可以根据需要选择不同的窗口,但原理是一样的。

【讨论】:

daily_summaries不应该有group by子句吗? @user3609179 确定! 我还想显示当月的所有日历日期,这样它可以是一个完整的时间序列,我该怎么做? 您说您有带日期的表格,它在上面的查询中使用并显示所有日期。如果您只想要当前月份,则使用where date_trunc('month',date)=date_trunc('month',current_date) 过滤它,其中date 是您的日期列 是的,所以我希望结果包含该月的所有日期。使用数字列按天计算的平均值。如果这有意义?【参考方案2】:

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

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;

也许其中之一就是您正在寻找的。​​p>

【讨论】:

这是否可行并将值除以间隔中的天数? @user3609179 。 . .是的,确实如此。 我收到以下错误错误:带有 ORDER BY 子句的聚合窗口函数需要一个框架子句 @user3609179 。 . . RedShift 中最奇怪的荒谬之处。为什么它不像其他数据库一样默认窗口框架?

以上是关于基于不同日期的红移滚动平均值的主要内容,如果未能解决你的问题,请参考以下文章

基于另一个表的计数的表中的红移样本

SQL - 在截断日期上滚动平均值

如何使用滚动功能来预测基于简单移动平均线或其他策略的趋势

根据日期范围计算滚动平均值[重复]

如何在 MySQL 8 中使用两个变量进行滚动平均?

PostgreSQL 中基于时间戳的移动平均线