基于不同日期的红移滚动平均值
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 中最奇怪的荒谬之处。为什么它不像其他数据库一样默认窗口框架?以上是关于基于不同日期的红移滚动平均值的主要内容,如果未能解决你的问题,请参考以下文章