SQL - 检索最接近的值DOWN

时间:2018-05-08 23:11:18

标签: sql mariadb

这是我目前的sql:

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

这会正确返回具有最接近值的行: 12313672 。但是,我需要能够拉出最接近的较低数值。 (最接近12110433的数字)

我已经尝试使用top 1的方法,但这对我来说错误,所以我无法使用它。

我还需要经常快速地运行它,它会对我的数据库造成负担吗?

谢谢

2 个答案:

答案 0 :(得分:2)

最有效的方法是:

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

为了提高性能,您需要items(trumped, value)上的索引。

答案 1 :(得分:1)

使用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)