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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章