Один из способов - создать абсолютную разницу между входным значением и максимальным значением, а затем отсортировать по этому значению, чтобы получить строку с наименьшей абсолютной разницей.Но это будет самое близкое значение, будь то выше или ниже входного числа.Однако ваши пересмотренные требования предполагают, что если есть значение чуть выше входного значения, то вы бы предпочли это вместо этого.
SELECT max_value
FROM your_table
ORDER BY
-- give first priority to values above 450
CASE WHEN max_value >= 450 THEN 1 ELSE 2 END ASC
ABS(450 - max_value) ASC
LIMIT 1
Но тогда, к сожалению, вышеупомянутый подход не может использовать индексирование,и будет медленно на большом столе.Таким образом, чтобы использовать индекс для столбца max_value
, мы можем использовать UNION
для двух разных запросов SELECT, достигая ближайшего значения чуть выше 450 и чуть ниже 450. Так что попробуйте следующее:
SELECT dt.max_value FROM
(
(
-- getting the closest value just above 450
SELECT max_value, 1 AS priority
FROM your_table
WHERE max_value >= 450 -- notice >=
ORDER BY max_value ASC -- ASC LIMIT 1 to get value just above
LIMIT 1
)
UNION
(
-- getting the closest value just below 450
SELECT max_value, 2
FROM your_table
WHERE max_value <= 450 -- notice <=
ORDER BY max_value DESC -- DESC LIMIT 1 to get value just below
LIMIT 1
)
) dt
-- first priority to get the closest value above, then only below
ORDER BY dt.priority ASC