oracle中给定数字前最接近的数字

时间:2015-05-24 09:25:34

标签: sql oracle select

我在从给定号码获取最后一个号码时遇到问题(这个给定的号码来自不同的表格)

要求是:

Table A

Person Person_Entry_No

1       100

1       200

1       400
Table B

Person Person_Test

1       300

我需要输出

一个人去测试时的最新参赛作品编号(之前)(person_test)

Person  Person_entry_no

1       200    

我尝试使用LIMIT 1只从表1中获取一条记录......但它无效。

5 个答案:

答案 0 :(得分:3)

SELECT a.*
FROM TableA a JOIN TableB b ON ( b.Person = a.Person AND a.Person_Entry_No <= b.PersonTest )
AND NOT EXISTS ( SELECT 'b'
                 FROM TableA a2
                 WHERE a2.Person = a.Person
                 AND a2.Person_Entry_No <= b.PersonTest
                 AND a2.Person_Entry_No > a.Person_Entry_No    
               )

答案 1 :(得分:2)

Oracle Enterprise Database不支持

limit。相反,您可以使用fetch first子句:

SELECT a.*
FROM   a
JOIN   b ON a.person = b.person AND a.person_entry_no  < b.person_test
ORDER BY a.person_entry_no DESC  
FETCH FIRST 1 ROW ONLY

答案 2 :(得分:1)

尝试使用MAX的从属子查询:

SELECT b.*,
       (  SELECT max(Person_Entry_No) 
         FROM tableA a
         WHERE a.Person = b.Person
           AND a.Person_Entry_No < b.Person_Test
       ) As the_most_recen_entry_number
FROM tableB b

演示:http://sqlfiddle.com/#!4/d53e2/1

答案 3 :(得分:1)

使用MAX()获取最高价值。

SELECT A.Person, MAX(A.Person_Entry_No)
FROM A
JOIN B ON A.Person = B.Person AND A.Person_Entry_No < B.Person_Test
GROUP BY A.Person

答案 4 :(得分:0)

如果你需要的不只是一个人,你应该选择窗口聚合函数:

select *
from 
 (
   SELECT a.*, b.Person_Test,
      row_number() -- rank the entry numbers
      over (partition by b.Person
            order by a.Person_Entry_No desc) as rn
   FROM TableA a
   JOIN TableB b ON a.Person = b.Person 
   where a.person_entry_no  < b.Person_Test
 ) dt
 where rn = 1 -- only the first row

fiddle