我有一张桌子WT_RT。
上面的select
会给我这个结果
select * from WT_RT;
WT_SEQ W RT_AMT R
---------- - ---------- -
0 0 125 M
1 2 9.3 N
45 2 7.19 Q
100 1 6.38 Q
300 1 5.11 Q
500 2 4.69 Q
1000 2 4.39 Q
在输入WT_SEQ=250
时,由于250在100和300之间,因此我需要选择RT_AMT
最少的行。在这种情况下,由于5.11 < 6.38
,我需要选择WT_SEQ
= 300的行。
预期结果:
WT_SEQ W RT_AMT R
---------- - ---------- -
300 1 5.11 Q
到目前为止,我设法找到了其中的两行。
select ........;
WT_SEQ W RT_AMT R
---------- - ---------- -
100 1 6.38 Q
300 1 5.11 Q
但是我需要实现RT_AMT
的最小值的条件
怎么做?
答案 0 :(得分:0)
一种方法是按距离排序的前2个。
然后按RT_AMT排序订单的前1名。
select WT_SEQ, RT_AMT
from
(
select *
from
(
select *
from WT_RT
cross join (select 250 val from dual) v
order by ABS(WT_SEQ - val)
) q1
where rownum <= 2
order by (case when WT_SEQ = val then 1 else 2 end), RT_AMT asc
) q2
where rownum = 1;
添加了CASE WHEN,以使WT_SEQ的优先级等于该值。
答案 1 :(得分:0)
您可以尝试编写一个子查询以通过LEAD
获取nextval,然后使用BETWEEN
在WT_SEQ
列之间进行获取,然后使用join
自我WT_SEQ
然后将Row_NUMBER
与 Windows Function 一起使用,以RT_AMT
来获得行号,然后得到rn = 1
TestDLL
CREATE TABLE WT_RT(
WT_SEQ INT,
RT_AMT FLOAT
);
INSERT INTO WT_RT VALUES (0,125);
INSERT INTO WT_RT VALUES ( 1, 9.3);
INSERT INTO WT_RT VALUES ( 45,7.19);
INSERT INTO WT_RT VALUES ( 100,6.38);
INSERT INTO WT_RT VALUES ( 300,5.11);
INSERT INTO WT_RT VALUES ( 500,4.69);
INSERT INTO WT_RT VALUES (1000,4.39);
查询
WITH CTE1 AS(
SELECT t2.WT_SEQ,t2.RT_AMT,Row_NUMBER() OVER(ORDER BY t2.RT_AMT) rn
FROM (
SELECT * FROM (
SELECT t1.*,LEAD(WT_SEQ,1,WT_SEQ) over(order by WT_SEQ) nextval
FROM WT_RT t1
)t1
WHERE 250 BETWEEN WT_SEQ and nextval
) t1 INNER JOIN WT_RT t2
on t1.WT_SEQ = t2.WT_SEQ or t1.NEXTVAL = t2.WT_SEQ
)
SELECT *
FROM CTE1
WHERE RN = 1
[结果] :
| WT_SEQ | RT_AMT | RN |
|--------|--------|----|
| 300 | 5.11 | 1 |
答案 2 :(得分:0)
您可以只使用聚合:
select MIN(RT_AMT)
from WT_RT
where WT_SEQ <= 250
如果需要整行,则可以选择一行。在Oracle 12C +中:
select MIN(RT_AMT)
from WT_RT
where WT_SEQ <= 250
order by WT_SEQ desc
fetch first 1 row only;
在旧版本中:
select x.*
from (select MIN(RT_AMT)
from WT_RT
where WT_SEQ <= 250
order by WT_SEQ desc
) x
where rownum = 1;