У меня есть база данных MySQL с измеренными температурами от трех разных датчиков. При каждом обновлении датчика новая температура записывается в базу данных. Таким образом, для каждого значения существуют разные временные метки.
Я хотел бы рассчитать среднюю температуру трех комнат для каждой отметки времени. Есть ли SQL-Query для этого?
Table A: timestamp + value
0000-00-00 00:00:00.000 19.6
2018-01-22 20:45:31.594 19.6
2018-01-22 20:48:20.344 19.7
2018-01-22 20:50:54.567 19.8
2018-01-22 20:53:14.594 19.9
2018-01-22 20:55:20.087 20.0
Table B: timestamp + value
0000-00-00 00:00:00.000 18.4
2018-01-22 20:50:53.700 18.4
2018-01-22 20:53:38.417 18.5
2018-01-22 20:56:08.668 18.6
2018-01-22 20:58:24.422 18.7
2018-01-22 21:00:25.707 18.8
Table C: timestamp + value
0000-00-00 00:00:00.000 20.1
2018-01-22 20:47:07.669 20.1
2018-01-22 20:49:32.196 20.2
2018-01-22 20:49:42.184 20.2
2018-01-22 20:51:42.177 20.2
Result:
2018-01-22 20:45:31.594 (19.6+18.4+20.1)/3
2018-01-22 20:47:07.669 (19.6+18.4+20.1)/3
2018-01-22 20:48:20.344 (19.7+18.4+20.1)/3
2018-01-22 20:49:32.196 (19.7+18.4+20.2(/3
…
Предполагая, что у нас есть таблица C и некоторая временная метка '2018-01-22 20: 51: 42.177', я хотел бы построить среднее значение с последней меткой времени из таблицы A и таблицы B до этой метки времени из таблицы C. Должно быть следующее: таблица B: '2018-01-22 20: 50: 53.700' и таблица A: '2018-01-22 20: 50: 54.567' плюс наоборот для других таблиц
Как насчет этого:
select
c.timestamp,
(
c.value
+ (select coalesce(min(b.value),0.0) from b where b.timestamp =
(select max(b2.timestamp) from b as b2
where b2.timestamp <= c.timestamp))
+ (select coalesce(min(a.value),0.0) from a where a.timestamp =
(select max(a2.timestamp) from a as a2
where a2.timestamp <= c.timestamp))
) / 3 as average
from c
Если вы добавите датчики в свою систему, вы, вероятно, захотите создать для них единую консолидированную таблицу. Но это будет работать для трех датчиков:
select timestamp, avg(value) as average_value from (
select timestamp, value from table_a
union all
select timestamp, value from table_b
union all
select timestamp, value from table_c
)
group by timestamp
Соедините все три таблицы, используя временную метку, и найдите затем вычислить среднее значение температуры.
Выберите T1.TIMESTAMP, (T1.VAL + T2.VAL + T3.VAL)/3 AS AVG_TEMP FROM T1 JOIN T2 ON T1.TIMESTAMP = T2.TIMESTAMP JOIN T3 ON T1.TIMESTAMP = T3.TIMESTAMP