2013-04-02 5 views
0

У меня есть очень большая таблица, где у меня температура регистрируется каждые 1 мин, то, что я хотел бы запросить, - это тренд; что-то как процентное увеличение или процентного снижения за выбранный период (час или 15 минут, в зависимости от запроса)Запрос Mysql, чтобы получить тенденцию температуры

мой стол выглядит (пример), как в следующем

ID  time    temp 
119950 2013-03-27 07:56:05 27.25 
119951 2013-03-27 07:57:05 27.50 
119952 2013-03-27 07:58:05 27.60 
119953 2013-03-27 07:59:05 27.80 
119954 2013-03-27 08:00:05 27.70 
119955 2013-03-27 08:01:05 27.50 
119956 2013-03-27 08:02:05 27.25 
119957 2013-03-27 08:03:05 27.10 
119958 2013-03-27 08:04:05 26.9 
119959 2013-03-27 08:05:05 27.1 
119960 2013-03-27 08:06:05 27.25 
119961 2013-03-27 08:07:05 27.6 

Я считаю, что тенденция может быть рассчитана следующим образом (согласно link), но исправьте меня, если у вас есть лучший способ; берем разницу между каждой строкой, затем добавляем вверх и делим на подсчет. поэтому для таблицы выше мы получаем

Diff 
+0.25 
+0.10 
+0.20 
-0.10 
-0.20 
-0.25 
-0.15 
-0.20 
+0.20 
+0.15 
+0.35 

Тенденция в минуту за последние 11 минут представляет собой сумму diff/11. который дает 0.063C в минуту за последние 11 минут.

Может кто-то, пожалуйста, помогите мне получить процентную тенденцию в час за последние 3 часа. и тренд в минуту в течение 1 часа?

+1

Заметим, что сумма всех этих различий равна разнице между начальное и конечное значения. Следовательно, изменение процента может быть получено из «final/initial-1» - например, '27.6/27.25 - 1 ~ = + 1.28%'. – eggyal

+0

Спасибо, но приведенная выше таблица - всего лишь пример. это исключение. обычно значения будут повсюду, и сумма всех различий не будет равна разнице между начальным и конечным. – Ossama

+2

Нет - сумма всех различий будет * всегда * равна разности между начальным и конечным из-за ассоциативности сложения. – eggyal

ответ

2
CREATE TABLE temperature_log 
(ID  INT NOT NULL,dt DATETIME NOT NULL, temperature DECIMAL(5,2) NOT NULL); 

INSERT INTO temperature_log VALUES 
(119950 ,'2013-03-27 07:56:05',27.25), 
(119951 ,'2013-03-27 07:57:05', 27.50), 
(119952 ,'2013-03-27 07:58:05', 27.60), 
(119953 ,'2013-03-27 07:59:05', 27.80), 
(119954 ,'2013-03-27 08:00:05', 27.70), 
(119955 ,'2013-03-27 08:01:05', 27.50), 
(119956 ,'2013-03-27 08:02:05', 27.25), 
(119957 ,'2013-03-27 08:03:05', 27.10), 
(119958 ,'2013-03-27 08:04:05', 26.9), 
(119959 ,'2013-03-27 08:05:05', 27.1), 
(119960 ,'2013-03-27 08:06:05', 27.25), 
(119961 ,'2013-03-27 08:07:05', 27.6); 

SELECT x.* 
    , x.temperature - y.temperature diff 
    , COUNT(*) cnt 
    ,(x.temperature-y.temperature)/COUNT(*) trend 
    FROM temperature_log x 
    JOIN temperature_log y 
    ON y.id < x.id 
GROUP 
    BY x.id; 
+--------+---------------------+-------------+-------+-----+-----------+ 
| ID  | dt     | temperature | diff | cnt | trend  | 
+--------+---------------------+-------------+-------+-----+-----------+ 
| 119951 | 2013-03-27 07:57:05 |  27.50 | 0.25 | 1 | 0.250000 | 
| 119952 | 2013-03-27 07:58:05 |  27.60 | 0.35 | 2 | 0.175000 | 
| 119953 | 2013-03-27 07:59:05 |  27.80 | 0.55 | 3 | 0.183333 | 
| 119954 | 2013-03-27 08:00:05 |  27.70 | 0.45 | 4 | 0.112500 | 
| 119955 | 2013-03-27 08:01:05 |  27.50 | 0.25 | 5 | 0.050000 | 
| 119956 | 2013-03-27 08:02:05 |  27.25 | 0.00 | 6 | 0.000000 | 
| 119957 | 2013-03-27 08:03:05 |  27.10 | -0.15 | 7 | -0.021429 | 
| 119958 | 2013-03-27 08:04:05 |  26.90 | -0.35 | 8 | -0.043750 | 
| 119959 | 2013-03-27 08:05:05 |  27.10 | -0.15 | 9 | -0.016667 | 
| 119960 | 2013-03-27 08:06:05 |  27.25 | 0.00 | 10 | 0.000000 | 
| 119961 | 2013-03-27 08:07:05 |  27.60 | 0.35 | 11 | 0.031818 | 
+--------+---------------------+-------------+-------+-----+-----------+ 

Кстати, если вы заинтересованы в получении средних результатов в час, вы могли бы сделать что-то вроде этого ...

SELECT DATE_FORMAT(x.dt,'%Y-%m-%d %h:00:00') 
    , AVG(x.temperature) avg_temp 
    FROM temperature_log x 
GROUP 
    BY DATE_FORMAT(x.dt,'%Y-%m-%d %h:00:00'); 
+0

Спасибо, но с тех пор, как я из 100 тысяч значений, вы могли бы вставить фильтр, чтобы получать почасовые температуры в течение 3 часов? – Ossama

+0

Да, но это другой вопрос. Было бы нецелесообразно вносить поправки в ответ без предварительного изменения вопроса (или принятия его, а затем запроса нового). – Strawberry

+0

Я очень ценю вашу помощь, спасибо :). мой оригинальный вопрос упоминает об этом, поскольку у меня так много данных; Я не могу понять, работает ли ваш ответ, и он будет принимать soooo looong, чтобы получить результат за все, если! – Ossama

Смежные вопросы