Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 由于日期不一致,无法计算7天移动平均线_Postgresql - Fatal编程技术网

Postgresql 由于日期不一致,无法计算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 通过使用范围而不是行作为范围规格,您可以

我只是注意到我下面的代码实际上不是一个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

通过使用范围而不是行作为范围规格,您可以更接近真正的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非常感谢你。我非常感激。认真地