У меня есть этот запрос, который ведет себя очень странно. Я ожидаю получить значения MIN и MAX в заданном временном диапазоне и игнорировать значения, которые равны 0.
По какой-то причине этот запрос возвращает значение, которого нет в базе данных
SELECT
block_id,
device_id,
MAX(NULLIF(meter_reading, 0)) max_reading,
MIN(NULLIF(meter_reading, 0)) min_reading,
DATE_FORMAT(FROM_UNIXTIME(sensor_time), '%Y-%m-%d') AS time_frame
FROM
tbl_meter_data
WHERE
plant_id = 114
AND sensor_time BETWEEN 1586820600 AND 1586871000
AND HOUR(FROM_UNIXTIME(sensor_time)) BETWEEN 5 AND 18
AND ignore_status = 0
GROUP BY block_id , device_id, time_frame;
Это результат, который он выдает
Где эти значения отсутствуют в базе данных
Если я запускаю то же самое запрос без NULLIF Я получаю правильные значения
SELECT
block_id,
device_id,
MAX(meter_reading) max_reading,
MIN(meter_reading) min_reading,
DATE_FORMAT(FROM_UNIXTIME(sensor_time), '%Y-%m-%d') AS time_frame
FROM
tbl_meter_data
WHERE
plant_id = 114
AND sensor_time BETWEEN 1586820600 AND 1586871000
AND HOUR(FROM_UNIXTIME(sensor_time)) BETWEEN 5 AND 18
AND ignore_status = 0
GROUP BY block_id , device_id, time_frame;
Это результат без NULLIF
Я также столкнулся с той же проблемой, пока используя ROUND () для этого параметра (meter_reading). Все значения были изменены благодаря ROUND (), хотя значения не были дробными.
Примечание: meter_reading тип данных float
Это пример набора данных, если вы хотите проверить: Набор данных