经常我们在使用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;