【发布时间】:2013-12-15 20:59:14
【问题描述】:
我看到这里的一些人遇到了和我现在一样的问题......但没有任何帮助:/
我有一个包含 2 列的表 Test。日期和整数值。 我需要每 N 条记录的平均值。 比如
Date | Info
2013-01-01 | 210
2013-01-02 | 213
2013-01-03 | 214
2013-01-05 | 197
2013-01-06 | 192
....
让我们假设 N = 3
我需要填充一个表格
Averages
212.3333 (that's the average of the 3 first Info's) (210+213+214)/3
208.0000 (213+214+197)/3
201.0000 (214+197+192)/3
我试过了
delimiter $$
DROP PROCEDURE IF EXISTS calcAvg$$
CREATE PROCEDURE calcAvg()
begin
DECLARE v_finished INTEGER DEFAULT 0;
declare v_avg DECIMAL default 0.0;
DECLARE initial_date date;
DEClARE cr CURSOR FOR
select avg(i) from (
select t.info i
from test t
where date >= initial_date
limit 3
)as s;
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;
set initial_date = '2013-01-01';
get_avg: LOOP
OPEN cr;
cr_loop: LOOP
FETCH cr INTO v_avg;
IF v_finished = 1 THEN
LEAVE cr_loop;
END IF;
insert into result values (v_avg);
END LOOP cr_loop;
CLOSE cr;
#I've to change this line... the table does not have all days
set v_dt_ini = date_add(v_dt_ini,interval 1 DAY);
#But the problem it's not the line yet...
set v_finished = 0;
if v_dt_ini > '2013-05-30' then
leave get_avg;
end if;
END LOOP get_avg;
end$$
在我已将 N 固定为 3 的代码中 问题是,当我调用程序时......它计算 3 条记录的第一个平均值......并且当再次执行游标时......它返回相同的值......第 3 条记录......它不是我需要什么...
光标没有改变结果:/
【问题讨论】:
-
行是否以任何方式排序? IE。是保证日期总是增加,还是有另一个 AUTO_INCREMENT 列?这将使问题变得微不足道!
-
是的,它有一个 id 并且日期有一个唯一索引...在这种情况下,只有日期保证...当我进行此搜索时,请选择 avg(i) from ( select t.info我来自测试 t where date >= '2013-01-01' limit 3 )as s;它使我恢复了从 2013 年 1 月 1 日开始的 3 个值的正确平均值...并且它适用于我放在代码上的所有日期...所以我将代码用作 CURSOR .. 带有变量 INITIAL_DATE我在外部循环上递增...
标签: mysql sql group-by average