Андрей
Высший разум
(425764)
4 года назад
Например, так:
SELECT
MIN(IF(parameter = 't', value, NULL)) AS t_min,
MAX(IF(parameter = 't', value, NULL)) AS t_max,
AVG(IF(parameter = 't', value, NULL)) AS t_avg,
MIN(IF(parameter = 'p', value, NULL)) AS p_min,
MAX(IF(parameter = 'p', value, NULL)) AS p_max,
AVG(IF(parameter = 'p', value, NULL)) AS p_avg,
MIN(IF(parameter = 'h', value, NULL)) AS h_min,
MAX(IF(parameter = 'h', value, NULL)) AS h_max,
AVG(IF(parameter = 'h', value, NULL)) AS h_avg
FROM info
WHERE dt_created > NOW() - INTERVAL 1 MINUTE;
Или так:
SELECT * FROM
(SELECT MIN(value) AS t_min, MAX(value) AS t_max, AVG(value) AS t_avg
FROM info
WHERE parameter = 't' AND dt_created > NOW() - INTERVAL 1 MINUTE) AS t,
(SELECT MIN(value) AS p_min, MAX(value) AS p_max, AVG(value) AS p_avg
FROM info
WHERE parameter = 'p' AND dt_created > NOW() - INTERVAL 1 MINUTE) AS p,
(SELECT MIN(value) AS h_min, MAX(value) AS h_max, AVG(value) AS h_avg
FROM info
WHERE parameter = 'h' AND dt_created > NOW() - INTERVAL 1 MINUTE) AS h;
Или совершенно стандартным запросом, возвращающим 3 строки данных:
SELECT parameter, MIN(value) AS mn, MAX(value) AS mx, AVG(value) AS av
FROM info
WHERE dt_created > NOW() - INTERVAL 1 MINUTE
GROUP BY parameter;
Ян ПетрушкинМастер (2187)
4 года назад
Спасибо, Андрей! Вы очень помогли. Я до сего времени не сталкивался с БД, но пришло время. Но этого же самого времени не хватало на чтение мануалов. Так то я устраню этот пробел.
Ян ПетрушкинМастер (2187)
4 года назад
Применил последний вариант.
Если не сложно. Ещё дополнение к вопросу. А если в GROUP BY требуется ещё timestamp?
Тогда вся схема летит к чертям.
Как я говорил у меня 3 сенсора в 15 местах. То есть раз в минуту БД пополняется на 45 строк. Так вот когда добавляю в GROUP BY timestamp (в SELECT) разумеется тоже, то по запросу вылетает 45 строк. Столбцы min, max, avg выдают одинаковые значения.
Я так понимаю, потому что он берёт один единственный замер с сенсора и ясно, что мин, макс и сред там равны. Но мне то надо, что бы он брал по всем сенсорам из этого замера и оттуда считал.
Jurijus Zaksas
Искусственный Интеллект
(424806)
4 года назад
В принципе, тебе ничто не мешает считывать данные из твоей таблицы сколько хочешь раз. Но! У каждого набора измерений должен быть какой-то общий признак, характеризующий, что это один и тот же набор. Примерно так:
SELECT T1.VALUE AS TEMPERATURE, T2.VALUE AS MOISTURE
FROM YOUR_TABLE T1
INNER JOIN YOUR_TABLE T2
ON T1.MEASURE_ID=T2.MEASURE_ID
WHERE T1.PARAMETER='TEMPERATURE'
AND T2.PARAMETER='MOISTURE'
Ну, как получить последнюю минуту, минимумы и прочее - разберешься уже, главное принцип.
Суть такая. В одной таблице у меня смешано три типа данных: температура, давление, влажность. Их значения находятся в столбце value. Есть столб parameter, в котором указано - что это - t, p или h. Мне надо считать эти данные и вывести на dashboard одним запросом.
Уточню:
Данные поступают раз в минуту с 15 приборов. В каждом приборе три сенсора: давление, влажность, температура. То есть раз в минуту база пополняется на 45 строк. Мне нужно считать данные за последнюю минуту, выбрать мин, макс и сред для каждого из показателей и отобразить на панели. Проблема в том, что это должен быть 1 запрос.
Есть варианты?