Это сложный вопрос.Но у меня есть таблица с полем 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. Например,
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. Сделайте то же самое в запросе № 1 длярезультирующий набор запроса номер два для каждого 5-минутного интервала дня (т.е. с 00:05:00 до 24:00:00).
Это довольно сложный вопрос, я понятия не имею, какначни это.Может ли кто-нибудь написать 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;
Ура!