我在Oracle数据库中有一个这样的表
ID
的 ------
10 000
25 000
40 000
61 000
75 000
我需要检查值,例如46 567,是否来自此表中的某些两个邻居值,选择最近的边界值< /强>
46 567在40 000到61 000之间,我应该选择40 000,因为它接近46 567而不是61 000.当然,我可以找到像这样的顶部和低边框
--top border
SELECT MIN(ID) FROM (SELECT * FROM this_table WHERE ID > 46567);
--low border
SELECT MAX(ID) FROM (SELECT * FROM this_table WHERE ID < 46567);
但是一个很酷的专家告诉我,我应该执行一些分层查询,它看起来真的很好,我不知道如何使用分层查询来解决这个问题。它应该看起来像这个Fibonacci SQL,但我无法实现它。
WITH
numbers (n, prev) AS (
SELECT 0 n, 1 prev from dual
UNION ALL
SELECT n + prev, n from numbers
WHERE n + prev < 50
)
你能帮助我吗?
答案 0 :(得分:2)
如果你有一个号码,你可以这样做:
select *
from (select t.*
from likethis t
where t.id <= 46567
order by t.id
) t
where rownum = 1;
或者,只是:
select max(id)
from likethis t
where t.id < 46567;
编辑:
如果您想要最接近的值:
select *
from (select t.*
from likethis t
order by abs(t.id - 46567)
) t
where rownum = 1;