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窗口函数计算平均值的最小周期的主要内容,如果未能解决你的问题,请参考以下文章