【问题标题】: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 值来获得熊猫滚动功能的结果。
【问题讨论】:
标签:
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() 不能为空。