这是一个复杂的问题 . 但我有一个表有一个DATETIME字段,还有一些其他int和float字段需要求和和平均 . 我们希望根据时间戳对此表进行求和和平均,并最终旨在开发3个查询,这些查询在某种意义上将相互构建 .
所以能干看起来像这样
TIMESTAMP |subj_diff| SCR2 | SCR3
2011-09-20 09:01:37 | 1 | 0.02 | 1.6
2011-09-20 09:04:18 | 3 | 0.09 | 1.8
2011-09-20 14:24:55 | 5 | 0.21 | 1.2
2011-09-21 18:50:47 | 8 | 0.08 | 0.9
2011-09-21 18:54:21 | 9 | 0.12 | 2.1
我们想要生成的三个查询是:
1. 将先前数据中的所有前述项目汇总到(包括当前选择的记录) . 还应该有另一个列的总数所以说,例如,如果我们想要在20和21之间的结果,返回的表将如下所示:
TIMESTAMP |subj_diff| SCR2 | SCR3 | COUNT
2011-09-20 09:01:37 | 1 | 0.02 | ... | 1
2011-09-20 09:04:18 | 4 | 0.11 | | 2
2011-09-20 14:24:55 | 9 | 0.32 | | 3
2011-09-21 18:50:47 | 17 | ...
2011-09-21 18:54:21 | 26 |
2. 以5分钟的时间间隔汇总结果 - 与上述类似,但查询将返回3行作为行1和2,行4和5将以与上述相同的方式汇总在一起 . 在这个查询中,如果每5分钟的间隔没有任何0,则返回0,计数为0 .
TIMESTAMP |subj_diff| SCR2 | SCR3 | COUNT
2011-09-20 09:05:00 | 4 | 0.11 | 3.4 | 2
2011-09-20 14:25:00 | 5 | 0.21 | 1.2 | 1
2011-09-21 18:55:00 | 17 | 0.20 | 3.0 | 2
3. 对于当天每5分钟间隔(即从00:05:00到24:00:00)的查询号2的结果集,在查询号1中执行相同的操作 .
这是一个相当棘手的问题,我不知道如何开始这个 . 有人能写SQL来解决这个问题吗?
下面是使用游标和存储过程的一些基本代码,但它并没有真正起作用 .
DROP PROCEDURE curdemo;
DELIMITER $$
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a datetime;
DECLARE b,c FLOAT;
DECLARE cur1 CURSOR FOR
SELECT msgDate, subj_diff FROM classifier_results
WHERE DATE(msgDate) >= DATE('2011-09-25');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
CREATE TEMPORARY TABLE IF NOT EXISTS temp_scores (d datetime, acc float);
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO a, b;
IF done THEN
LEAVE read_loop;
END IF;
INSERT temp_scores(d,acc)
SELECT a, SUM(subj_diff) FROM classifier_results
WHERE DATE(msgDate) >= DATE('2011-09-25')
AND msgDate <= a;
END LOOP;
CLOSE cur1;
SELECT * FROM temp_scores;
END;
干杯!
4 回答
在我看来,您可能希望使用存储过程和游标深入研究数据库编程 .
存储过程:http://dev.mysql.com/doc/refman/5.5/en/stored-programs-defining.html
游标:http://dev.mysql.com/doc/refman/5.5/en/cursors.html
这是一个巨大的球形蜡,超出了这篇文章的范围 .
让我们看看这里......
1:
2:
3:
希望我理解正确,让我知道它出现了一些问题 . :)
试试这个代码 -
创建和普及表:
并执行这些查询:
祝好运!
我没有对此进行过测试,但请告诉我这是否适合您:
1 .
2 .
3 .