Расчет масштабирования функций mysql
Мне нужно сформулировать запрос mysql, чтобы выбрать значения, нормализованные таким образом:
normalized = (value-min(values))/(max(values)-min(values))
Моя попытка выглядит так:
select
Measurement_Values.Time,
((Measurement_Values.Value-min(Measurement_Values.Value))/(max(Measurement_Values.Value)-min(Measurement_Values.Value)))
from Measurement_Values
where Measurement_Values.Measure_ID = 49 and Measurement_Values.time >= '2020-05-30 00:00'
но это явно неверно, так как возвращает только одно значение. Можете ли вы помочь мне найти правильный синтаксис?
1 ответ
Решение
В вашем вопросе мало пояснений, но я думаю, что вам нужны оконные функции (доступны только в MySQL 8.0):
select
time,
value,
(value - min(value) over() / (max(value) over() - min(value) over()) normalized_value
from measurement_values
where measure_id = 49 and time >= '2020-05-30 00:00'
Или, в более ранних версиях, вы можете получить тот же результат, объединив таблицу с помощью агрегированного запроса:
select
mv.time,
mv.value,
(mv.value - mx.min_value) / (mx.max_value - mx.min_value) normalized_value
from measurement_values
cross join (
select min(value) min_value, max(value) max_value
from measurement_values
where measure_id = 49 and time >= '2020-05-30 00:00'
) mx
where measure_id = 49 and time >= '2020-05-30 00:00'