使用具有相同 table 的 JOIN 选择具有属性最大值的前 N ​​行

Selecting N first rows with the biggest value of an attribute using JOIN with the same table

假设我有这样一个简单的数据库:

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

我想 select 通过使用 JOIN with People table 本身来 select N 最老的人。我试过用这种方式加入他们

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

能够计算出 p2 中比 p1 中特定人年长的人数,然后根据这个数字过滤结果,但我不知道如何计算它以及我加入这些的方式tables 是正确的:)

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

name     age
Jenny     75
Mark      44
Max       25
Lea       22

我想你的意思是:

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

您不需要联接,只需对嵌套查询进行排序即可:

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

较新的 Oracle 版本支持 FETCH FIRST:

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

您也可以试试:fetch first 4 rows with ties

不需要使用join,直接做

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

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