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

Posted

技术标签:

【中文标题】postgresql窗口函数计算平均值的最小周期【英文标题】:postgresql window function minimum period to calculate average 【发布时间】: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,还是将它们过滤掉? 【参考方案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() 不能为空。

【讨论】:

以上是关于postgresql窗口函数计算平均值的最小周期的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 中的窗口函数尾随日期

PostgreSQL 中的 PERCENTILE_DISC() 作为窗口函数

带有 LIMIT 的 PostgreSQL 窗口函数

带窗口函数的简单SQL查询优化

滚动值的复最小值

PostgreSQL 常用函数