【问题标题】:postgresql window function minimum period to calculate averagepostgresql窗口函数计算平均值的最小周期
【发布时间】:2022-01-03 05:33:19
【问题描述】:

我想计算 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 值来获得熊猫滚动功能的结果。

【问题讨论】:

  • 您想将短句转换为 NULL,还是将它们过滤掉?

标签: sql pandas postgresql postgresql-9.3 rolling-computation


【解决方案1】:

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

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);

【讨论】:

    【解决方案2】:

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

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

    我会建议你对窗口函数稍微不同的解决方案,以实现时间段:

    SELECT datestamp, symbol, avg(close) OVER (PARTITION BY symbol ORDER BY datestamp RANGE BETWEEN '251 days' PRECEDING AND CURRENT ROW) FROM daily_prices
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2014-12-09
      • 2016-11-04
      • 2017-09-26
      • 1970-01-01
      相关资源
      最近更新 更多