Postgresql 由于日期不一致,无法计算7天移动平均线
我只是注意到我下面的代码实际上不是一个7天移动平均值,而是一个7行移动平均值。我的表中的日期跨越几个月,我正在努力解决,因为我的数据流不一致,所以我不能期望window函数的最后7行实际代表一个7天平均值。谢谢Postgresql 由于日期不一致,无法计算7天移动平均线,postgresql,Postgresql,我只是注意到我下面的代码实际上不是一个7天移动平均值,而是一个7行移动平均值。我的表中的日期跨越几个月,我正在努力解决,因为我的数据流不一致,所以我不能期望window函数的最后7行实际代表一个7天平均值。谢谢 select date, sales, avg(sales) over(order by date rows between 6 preceding and current row) from sales_info order by date 通过使用范围而不是行作为范围规格,您可以
select date, sales,
avg(sales) over(order by date rows between 6 preceding and current row)
from sales_info
order by date
通过使用范围而不是行作为范围规格,您可以更接近真正的7天移动平均线 了解有关窗口功能框架的更多信息 我相信这应该对你有用:
select date, sales,
avg(sales) over(order by date range between '6 days' preceding and current row)
from sales_info
order by date;
下面是一个包含合成数据的演示:
SELECT i,
t,
avg(i) OVER (ORDER BY t RANGE BETWEEN '6 days' preceding and current row) FROM (
SELECT i, t
FROM generate_series('2021-01-01'::timestamp, '2021-02-01'::timestamp, '1 day') WITH ORDINALITY as g(t, i)
) sub;
i | t | avg
----+---------------------+------------------------
1 | 2021-01-01 00:00:00 | 1.00000000000000000000
2 | 2021-01-02 00:00:00 | 1.5000000000000000
3 | 2021-01-03 00:00:00 | 2.0000000000000000
4 | 2021-01-04 00:00:00 | 2.5000000000000000
5 | 2021-01-05 00:00:00 | 3.0000000000000000
6 | 2021-01-06 00:00:00 | 3.5000000000000000
7 | 2021-01-07 00:00:00 | 4.0000000000000000
8 | 2021-01-08 00:00:00 | 5.0000000000000000
9 | 2021-01-09 00:00:00 | 6.0000000000000000
10 | 2021-01-10 00:00:00 | 7.0000000000000000
11 | 2021-01-11 00:00:00 | 8.0000000000000000
12 | 2021-01-12 00:00:00 | 9.0000000000000000
13 | 2021-01-13 00:00:00 | 10.0000000000000000
14 | 2021-01-14 00:00:00 | 11.0000000000000000
15 | 2021-01-15 00:00:00 | 12.0000000000000000
16 | 2021-01-16 00:00:00 | 13.0000000000000000
17 | 2021-01-17 00:00:00 | 14.0000000000000000
18 | 2021-01-18 00:00:00 | 15.0000000000000000
19 | 2021-01-19 00:00:00 | 16.0000000000000000
20 | 2021-01-20 00:00:00 | 17.0000000000000000
21 | 2021-01-21 00:00:00 | 18.0000000000000000
22 | 2021-01-22 00:00:00 | 19.0000000000000000
23 | 2021-01-23 00:00:00 | 20.0000000000000000
24 | 2021-01-24 00:00:00 | 21.0000000000000000
25 | 2021-01-25 00:00:00 | 22.0000000000000000
26 | 2021-01-26 00:00:00 | 23.0000000000000000
27 | 2021-01-27 00:00:00 | 24.0000000000000000
28 | 2021-01-28 00:00:00 | 25.0000000000000000
29 | 2021-01-29 00:00:00 | 26.0000000000000000
30 | 2021-01-30 00:00:00 | 27.0000000000000000
31 | 2021-01-31 00:00:00 | 28.0000000000000000
32 | 2021-02-01 00:00:00 | 29.0000000000000000
。。。where date in(选择generate_series(当前_日期-间隔“7天”,当前_日期::时间戳,“1天”)::date)order by date
?哪个版本的postgres?如果您使用的是足够新的版本,则可以使用range-between而不是rows-between。@Jeremy我使用的是PostgreSQL 13.2。你能详细介绍一下如何使用range-between而不是rows-between吗?@Jeremy非常感谢你。我非常感激。认真地