我有一些如下所示的数据:
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
正如您所看到的,日期的频率各不相同,并且在不同的日期并不一致。我还有一个日期维度表,列出了我在年份和日期加入的所有相关月份的每一天。我想生成一个查询,该查询按天平均为该月的所有日期。这可能吗?我想要的结果是日期,平均值(平均值)
答案 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所有参赛作品的平均值,依此类推。如果需要,您可以选择不同的窗口,但原理是相同的。