эй, как я могу выбрать наибольшее значение конкретной даты?
Мои данные выглядят так:
id,value_id,sensor_id,value,time(datetime)
1,123,gas,10,2018-01-14 01:00:00
1,123,gas,20,2018-01-14 02:00:00
Я пробовал просматривать вещи (также с MAX), например:
SELECT value
FROM table
WHERE sensor_id = "123"
AND value_id = "gas"
AND time = "2018-01-14"
order by time;
limit 1;
Мне нужно выбрать максимальное значение конкретных данных, которые были зарегистрированы в определенную дату (а не интервал, т.е. 2017-01-01 → 2017-01-03, только для указанной даты: 2018-01-14).
Но я получаю ошибки или неправильные значения... спасибо для помощи
Попробуйте этот запрос:
SELECT value
FROM table
WHERE sensor_id = '123'
AND value_id = 'gas'
AND time >= '2018-01-14'
AND time < '2018-01-15'
ORDER BY value DESC
LIMIT 1;
Используйте одиночные кавычки вместо двойных кавычек.
Когда вы хотите получить наибольшее значение, вы должны заказать столбец по убыванию (DESC). И если это наивысшее значение не упорядочивается по времени, и вы можете просто select max(value)
в этом случае, поскольку это возвращаемое поле, а затем вам не нужен порядок и без ограничений.
Время, которое я предпочитаю делать с этой заменой, потому что иначе он не будет работать с отметками времени, и таким образом он всегда будет работать, независимо от того, имеет ли столбец дату или метку времени.
Это требует некоторых вложенных запросов.
Во-первых, вы хотите узнать последнее time
для каждого датчика на каждую дату.
Вы так понимаете
SELECT DATE(time) date, sensor_id, value_id,
MAX(time) lasttime
FROM table
GROUP BY DATE(time), sensor_id, value_id
Затем вы хотите получить столбец value
для этих строк. Это выглядит так
SELECT a.value, b.date, b.lasttime, b.sensor_id, b.value_id
FROM table a
JOIN (
SELECT DATE(time) date, sensor_id, value_id,
MAX(time) lasttime
FROM table
GROUP BY DATE(time), sensor_id, value_id
) b ON a.time=b.lasttime
AND a.sensor_id = b.sensor_id
AND a.value_id = b.value_id
Несколько трюков делают это возможным. Одним из них является использование MAX (date)... GROUP BY DATE (date), чтобы найти последнее время в течение каждого дня. Другой - это присоединение к исходной таблице для извлечения столбца value
,
SELECT MAX(value) FROM table WHERE time = '2018-01-14';