ORACLE巧用排序 查询最大值,第二大,第三大值。。。第N大值。

经常我们在使用sql的时候会使用到MAX,MIN等函数,但是通常会遇到几个比较的棘手的问题,需要查询与MAX()相关属性的时候,列名不能之间出现在sql的select中,要么使用goup by 添加到组合函数中,要么使用子查询,通常我们会发现,这样的作法会导致一个很简单的求最大值解法,写出来超过10行的sql。

直到工作中遇到这么一个问题,需要求解第二大,第三大的值。

一开始想法是,求最大值的时候就使用MAX,第二大值再排除到前面最大之后求最大,以后以此类推。想法固然简单,但是sql超级难写,且后面每个最大都必须依据已知的前面的最大才可求解,并越来越复杂。

后来突然想起oracle中的rownum,使用排序之后,可以完美获取到第一条数据,当然这个数据可以是最大,也可以是第二大,第三大值。。。第N大值。具体的sql如下:

思路:对求解最大值的数据进行降序排序,依据求解的第几大数据传入rownum的值,然后再对数据集进行反向排序,取得排序后的第一个值,这个数据就是我们需要的第几大数据。求解第几小方向雷同,只是排序改为先升序排序,再反向排序。

SELECT
      HC as "Value",
      NAME as "Name"
      from(
            SELECT *
             FROM (
                SELECT t.* FROM THC  t
                WHERE ORDER BY HC desc
             ) 
            where ROWNUM <=#rownum#
            ORDER BY HC asc
      )
    where ROWNUM =1;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值