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   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值