如果某些行具有相同的值,是否可以使用 ROWNUM SELECT 来自数据库的前 N 行?
Is it possible to SELECT N first rows from database using ROWNUM if some rows have the same value?
我正在尝试 select 使用 ROWNUM 从数据库中获取前 N 行。问题是,如果我想 select 6 个年龄的第一个值和这个年龄的人的名字,并且其中一些具有相同的年龄值,则不会显示每个人。
例如
name age
Peter 15
Mark 22
Kelly 17
Mike 17
George 17
如果我想显示具有 2 个最大年龄值的人,ROWNUM 将显示 Mark 和 Kelly 或 Mike 或 George。不是他们三个。预期结果是:
Name age
Mark 22
Kelly 17
Mike 17
George 17
是否可以使用 ROWNUM 得到这个结果?不是 RANK、DENSE_RANK、JOIN、相关子查询而是 ROWNUM?
您可以尝试这样的操作:
select *
from test
where age in (
select age
from (
select age
from test
group by age
order by age desc
)
where rownum <=2
)
正确的解决方案 dense_rank()
,但您可以仅使用 row_number()
和一些子查询来实现:
select t.*
from t
where t.age in (select age
from (select age
from t t2
order by age desc
) x
where rownum <= 2
);
在 Oracle 12+ 中,你可以简化这个:
select t.*
from t
where t.age in (select age
from t t2
order by age desc
fetch first 2 rows only
);
我正在尝试 select 使用 ROWNUM 从数据库中获取前 N 行。问题是,如果我想 select 6 个年龄的第一个值和这个年龄的人的名字,并且其中一些具有相同的年龄值,则不会显示每个人。 例如
name age
Peter 15
Mark 22
Kelly 17
Mike 17
George 17
如果我想显示具有 2 个最大年龄值的人,ROWNUM 将显示 Mark 和 Kelly 或 Mike 或 George。不是他们三个。预期结果是:
Name age
Mark 22
Kelly 17
Mike 17
George 17
是否可以使用 ROWNUM 得到这个结果?不是 RANK、DENSE_RANK、JOIN、相关子查询而是 ROWNUM?
您可以尝试这样的操作:
select *
from test
where age in (
select age
from (
select age
from test
group by age
order by age desc
)
where rownum <=2
)
正确的解决方案 dense_rank()
,但您可以仅使用 row_number()
和一些子查询来实现:
select t.*
from t
where t.age in (select age
from (select age
from t t2
order by age desc
) x
where rownum <= 2
);
在 Oracle 12+ 中,你可以简化这个:
select t.*
from t
where t.age in (select age
from t t2
order by age desc
fetch first 2 rows only
);