SQL - Получить ближайшее значение ВНИЗ - PullRequest
0 голосов
/ 09 мая 2018

вот мой текущий sql:

SELECT * FROM items
WHERE trumped = 1
ORDER BY ABS( `value` - 12110433 )
limit 3

Это корректно возвращает строку с ближайшим значением: 12313672 . Тем не менее, я должен иметь возможность вывести ближайший нижний номер значения. (Ближайший номер ниже 12110433)

Я пытался использовать методы с top 1, однако для меня это ошибки, поэтому я не могу его использовать.

Мне также нужно запускать это очень часто и быстро, будет ли это облагаться налогом в моей базе данных?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Самый эффективный способ будет:

SELECT i.*
FROM items i
WHERE i.trumped = 1 AND value < 12110433
ORDER BY value DESC
LIMIT 1;

Для производительности вам нужен индекс на items(trumped, value).

0 голосов
/ 09 мая 2018

Один из способов сделать это с union all.

(SELECT * FROM items
WHERE trumped = 1 AND `value`>=12110433
ORDER BY `value`-12110433
limit 1)
UNION ALL
(SELECT * FROM items
WHERE trumped = 1 AND `value`<12110433
ORDER BY 12110433-`value`
limit 1)

Если вы используете MariaDB версии 10.2 и выше, этого можно достичь с помощью функции row_number.

select *
from (select i.*,
      row_number() over(order by case when 12110433-`value`<0 then 1 else 0 end,`value`) as rnum_above,
      row_number() over(order by case when 12110433-`value`>0 then 1 else 0 end,`value`) as rnum_below
      from items i
     ) t
where 1 in (rnum_below,rnum_above)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...