我的问题是,我试图计算表中一些值的移动平均值(每行一个平均值)。它实际上是有效的,但如果涉及到id[20,18,17]或日期[2018-05-112018-05-92018-05-8]等差距,计算就会出错。我´我正在寻找一种方法来使用特定数量的下一行来防止这种情况发生。
该表包含 id (auto_increment), date and close (Float)
.
这是我的密码:
CREATE DEFINER=`root`@`localhost` PROCEDURE `moving_avg`(IN periode INT)
NO SQL
BEGIN
select hist_ask.id, hist_ask.date, hist_ask.close, round(avg(past.close),2) as mavg
from hist_ask
join hist_ask as past
on past.id between hist_ask.id - (periode-1) and hist_ask.id
group by hist_ask.id, hist_ask.close
ORDER BY hist_ask.id DESC
LIMIT 10;
END
我用的table看起来像这样
id , date , close
20 , 2018-10-13 , 12086.5
19 , 2018-10-12 , 12002.2
17 , 2018-10-11 , 12007.0
and so on
输出如下所示:
我从查询中得到的输出
提前谢谢!
1条答案
按热度按时间72qzrwbm1#
我终于用了一张临时table。我现在可以给这个过程提供两个参数:
周期:移动平均线的计算周期
_限制:限制结果集
对性能很重要的是
语句,因为它大大减少了执行时间。例如,当处理2000行时,它需要大约0.5秒,在添加它之前,它需要大约6秒
这就是代码:
结果如下:
主id,日期,结束,mavg
1999 2018-09-13 12086.6 12032.03
1998 2018-09-11 12002.2 11983.47
1997 2018-09-10 12007.3 11976.53
1996 2018-09-07 11940.9 11993.80
1995 2018-09-06 11981.4 12089.23
5行返回0.047秒/0.000秒