經常我們在使用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;