ORACLE 查詢第N條記錄及RANK()內部排序

方式一:結果集相減

SELECT column1, column2 FROM (SELECT * FROM table_name ORDER BY order_column DESC )
WHERE ROWNUM<=2
MINUS 
SELECT column1, column2 FROM (SELECT * FROM table_name ORDER BY order_column DESC )
WHERE ROWNUM<=1

方式二:ROWNUM定位法

-- 查詢第N條記錄
SELECT * FROM (
                SELECT
                        T.*,
                        ROWNUM AS RN            
                FROM
                        table_name T           
                WHERE
                        query_column1 = '?'                      
                    AND query_column2  = '?'           
                ORDER BY
                        order_column DESC) TEMP
                
WHERE TEMP.RN = 'N'

方式三:子查詢篩選

SELECT
        ID,
        NAME
FROM
        (
                SELECT
                        T.ID,
                        T.NAME    ,
                        RANK() OVER(ORDER BY order_column) AS RN
                FROM
                        TABLE_NAME T
        ) TMP
WHERE
        TMP.RN + 1 =
        (
                SELECT
                        MAX(RN)
                FROM
                        (
                                SELECT
                                        T.ID,
                                        T.NAME    ,
                                        RANK() OVER(ORDER BY order_column) AS RN
                                FROM
                                        TABLE_NAME T
                        )
        )

RANK()內部排序 及 PARTITION BY結果集分組

-- 查詢每組前五名
SELECT
        *
FROM
        (
                SELECT
                        E.*,
                        RANK() OVER (PARTITION BY E.GROUP_COLUMN ORDER BY E.ORDER_COLUMN) RK
                FROM
                        TABLE_NAME E
        )
        TMP
WHERE
        TMP.RK <= 5;

rank()與dense_rank()區別:

相同點:1.都會根據order by 的內容進行遞增排序。2.遇到partition by值相同時RK不會遞增

不同點:1.在下一個相同值rank()會跳號,dense_rank()不會跳號。

              2.遇到下一個不同值時rank()會累計,dense_rank() 不會累計。

SELECT
        COLUMN1,
        COLUMN2,
        RANK() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2 DESC) RK,
        DENSE_RANK() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2 DESC) D_RK
FROM
        TABLE_NAME;

COLUMN1  |  COLUMN2  |  RK  |  D_RK  
-------------------------------------
  MON       11000       1        1   
  TUES      12000       2        2   
  WED       13000       3        3   
  THUR      15000       4        4   
  FRI       15000       4        4   
  SAT       18000       6        5   

 

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