选择以基于列的最小值获取行

时间:2018-07-31 07:32:00

标签: sql oracle select

我有一张桌子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的最小值的条件 怎么做?

3 个答案:

答案 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,然后使用BETWEENWT_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

sqlfiddle

[结果]

| 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;