Oracle数据库表中查询最大值和第二大值

时间:2022-07-31 14:47:45

我们以机构表为例,机构表中的id字段是varchar2类型的,而不是number类型,所有要先转换为number。

select to_number(id) as id from ORGANIZATION;

运行效果如下图所示:

Oracle数据库表中查询最大值和第二大值

我们按降序排序来查询,

select to_number(id) as id from ORGANIZATION ORDER BY id DESC;

如下图所示:

Oracle数据库表中查询最大值和第二大值Oracle数据库表中查询最大值和第二大值

我们不使用order by,而用max()函数来获取最大的值

select max(to_number(id)) from ORGANIZATION;

运行效果如下图所示:我们得到最大值为33.

Oracle数据库表中查询最大值和第二大值Oracle数据库表中查询最大值和第二大值

现在我们要找出第二大值,我们要使用到ROWNUM,我们先查询出最大值和第二大值。

select * from (select to_number(id) as id from ORGANIZATION ORDER BY id desc) where ROWNUM<3;

运行效果如下图所示:

Oracle数据库表中查询最大值和第二大值Oracle数据库表中查询最大值和第二大值

有了最大值和第二大值,如何查询出第二大值呢?

我们可以使用如下语句来查看这些结果是如何排序的。

select ROWNUM r,id from(select to_number(id) as id from ORGANIZATION ORDER BY id desc);

Oracle数据库表中查询最大值和第二大值Oracle数据库表中查询最大值和第二大值

接下来,我们就可以在上面的基础上稍作处理,就可以查询出第二大值这条记录了

select * from (select ROWNUM r,id from(select to_number(id) as id from ORGANIZATION ORDER BY id desc)where ROWNUM<3) e where e.r>1 ;

运行效果如下图:

Oracle数据库表中查询最大值和第二大值Oracle数据库表中查询最大值和第二大值


我们不能使用如下语句来得到第二大值:

select id from (select to_number(id) as id from ORGANIZATION ORDER BY id desc) where ROWNUM<3 and ROWNUM>=2

运行结果是空

Oracle数据库表中查询最大值和第二大值Oracle数据库表中查询最大值和第二大值

这是为什么呢?

因为rownum是oracle预处理字段,默认标序是1,只有记录集已经满足条件后才会进行后续编号。这样你查询ORGANIZATION  表时遍历第一条数据时rownum是1,不符合条件,继续遍历到第二条数据rownum仍为1,仍不符合条件,直至遍历完所有数据,都无数据返回。