首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgresql窗口函数计算平均值的最小周期

postgresql窗口函数计算平均值的最小周期
EN

Stack Overflow用户
提问于 2021-11-24 20:42:13
回答 2查看 30关注 0票数 1

我想要计算252天滚动期间的滚动平均值,但只有当252天的数据在表中可用,否则行的空值。目前我使用的是这个查询:SELECT datestamp, symbol, avg(close) OVER (PARTITION BY symbol ORDER BY datestamp ROWS BETWEEN 251 PRECEDING AND CURRENT ROW) FROM daily_prices

如果252天的数据不可用,它也会给出平均值。我想要一个确切的结果,就像我们通过定义min_period值来定义pandas滚动函数一样。

EN

回答 2

Stack Overflow用户

发布于 2021-11-24 20:59:59

“我想计算252天的滚动平均值。”

根据ORDER BY datestamp子句,ROWS BETWEEN 251 PRECEDING AND CURRENT ROW子句不是指一段时间,而是指窗口中位于当前行之前的行数。

为了实现这段时间,我建议您使用一个稍微不同的窗口函数解决方案:

代码语言:javascript
复制
SELECT datestamp, symbol, avg(close) OVER (PARTITION BY symbol ORDER BY datestamp RANGE BETWEEN '251 days' PRECEDING AND CURRENT ROW) FROM daily_prices

那我就不明白在哪种情况下你想要一个空值。在当前行的窗口中,您将至少拥有当前行,因此avg()不能为null。

票数 0
EN

Stack Overflow用户

发布于 2021-11-24 21:16:12

只需对同一窗口进行计数,并使用它来修改您的结果。我使用了一个命名窗口来避免重复指定相同的窗口。

代码语言:javascript
复制
with daily_prices as (select 1 as symbol, 5 as close, t as datestamp from generate_series(now()-interval '1 year',now(),interval '1 day') f(t))
SELECT 
  datestamp, 
  symbol, 
  case when count(close) OVER w = 252 then 
    avg(close) OVER w 
  end
FROM daily_prices 
window w as (PARTITION BY symbol ORDER BY datestamp ROWS BETWEEN 251 PRECEDING AND CURRENT ROW);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70102665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档