我想要计算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滚动函数一样。
发布于 2021-11-24 20:59:59
“我想计算252天的滚动平均值。”
根据ORDER BY datestamp子句,ROWS BETWEEN 251 PRECEDING AND CURRENT ROW子句不是指一段时间,而是指窗口中位于当前行之前的行数。
为了实现这段时间,我建议您使用一个稍微不同的窗口函数解决方案:
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。
发布于 2021-11-24 21:16:12
只需对同一窗口进行计数,并使用它来修改您的结果。我使用了一个命名窗口来避免重复指定相同的窗口。
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);https://stackoverflow.com/questions/70102665
复制相似问题