oracle选择第二大的数据,怎样获得数据表中某个字段的第二个最大值?

还应该考虑到最大值是重复的情况,所以使用dense_rank,而不用row_number.

因为dense_rank:连续排序,重复值算同一个名次,

而row_number则是流水号,重复值的流水号是不同的。

如有值:1,2,3,4,5,5

SQL> select a,row_number() over(order by a desc) "名次" from t_max;

A         名次

---------- ----------

5          1

5          2

4          3

3          4

2          5

1          6

6 rows selected

SQL> select a,dense_rank() over(order by a desc) "名次" from t_max;

A         名次

---------- ----------

5          1

5          1

4          2

3          3

2          4

1          5

6 rows selected

所以,正确的SQL应该是

SQL> select max(a) from

2  (

3   select a,dense_rank() over(order by a desc) m from t_max

4  )

5  where m>1;

MAX(A)

----------

4

--------------测试代码------------------------

SQL> create table t_max

2  (

3     a number

4  );

Table created

SQL> insert into t_max values(1);

1 row inserted

SQL> insert into t_max values(2);

1 row inserted

SQL> insert into t_max values(3);

1 row inserted

SQL> insert into t_max values(4);

1 row inserted

SQL> insert into t_max values(5);

1 row inserted

SQL> insert into t_max values(5);

1 row inserted

SQL> commit;

Commit complete

SQL> select max(a) from

2  (

3   select a,row_number() over(order by a desc) m from t_max

4  )

5  where m>1;

MAX(A)

----------

5

SQL> select max(a) from

2  (

3   select a,dense_rank() over(order by a desc) m from t_max

4  )

5  where m>1;

MAX(A)

----------

4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值