使用具有相同表格的{JOIN}选择具有最大属性值的N个第一行

时间:2016-03-17 15:17:49

标签: sql oracle join sql-order-by greatest-n-per-group

让我们说我有这样简单的数据库:

People
name    age
Max     25
Mike    15
Lea     22
Jenny   75
Juliet  12
Kenny   10
Mark    44

我想通过使用JOIN和People表本身从那里选择N最老的人。我试图以这种方式加入他们

People p1 JOIN People p2 ON p1.age < p2.age

能够在p2中计算p2中与p1中特定一个人相比较年长的人数,然后根据此数字过滤结果,但我不知道如何计算它以及我是否加入这些表格是正确的:)

对于N = 4,预期结果为:

name     age
Jenny     75
Mark      44
Max       25
Lea       22

4 个答案:

答案 0 :(得分:1)

我认为你的意思是:

SELECT t.name,t.age FROM (
    SELECT p1.name,p1.age,count(*) as cnt FROM People p1
    JOIN People p2ORDER ONBY p1.age < p2.age
    GROUP BY p1.name,p1.age) t
WHERE t.cnt <= N

但是没有必要,你可以使用ORACLE的rownum

SELECT * FROM (
    SELECT * FROM People p1
    ORDER BY p1.age DESC)
WHERE ROWNUM <= N

答案 1 :(得分:1)

较新的Oracle版本支持FETCH FIRST

select *
from people
order by age desc
fetch first 4 rows only

您还可以尝试:fetch first 4 rows with ties

答案 2 :(得分:0)

您不需要加入,只需对嵌套查询进行排序:

select *
from (
        select *
        from people
        order by age desc
     )
where rownum <= 5 

答案 3 :(得分:0)

无需使用连接,只需执行

select * from
(select p1.name,p1.age, row_number() over (order by p1.age desc) order_n from people)
where order_n <=N

(如果我正确地解释了你的问题)