使用具有相同 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
(如果我正确解释了你的问题)
假设我有这样一个简单的数据库:
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
(如果我正确解释了你的问题)