Oracle rownum / row_number / rank / dense_rank 這四個的差異

Oracle PL/SQL中ROW_NUMBER与ROWNUM的高效排序比较
本文对比了Oracle PL/SQL中的ROW_NUMBER和ROWNUM关键字在排序上的应用,通过示例展示了ROW_NUMBER如何提供更灵活的排序方式,包括在排序前配置、使用分析函数进行排序等场景,以及ROW_NUMBER与ROW_RANK、DENSE_RANK的差异,特别是当涉及到分组排序时的用法。



Oracle PL/SQL 有  rownum 這個大家常用的內定關鍵字,

但在排序使用上, 卻有一點不方便,

這是因為  rownum 會在排序前先配置好的緣故,

這時候, 用 oracle 分析函數  row_number() 是一個不錯的選擇,

範例如下 :
 程式碼
-- 建立 Temp Table
CREATE TABLE TOM1(
  EMPLOYEE VARCHAR2(30)
, DEPT_NO  VARCHAR2(30)
, SALARY   NUMBER
);
 
-- 建立 Temp Data
INSERT INTO TOM1 VALUES( 'B', '電腦室', 1000 );
INSERT INTO TOM1 VALUES( 'C', '會計室', 2000 );
INSERT INTO TOM1 VALUES( 'D', '電腦室', 2500 );
INSERT INTO TOM1 VALUES( 'A', '總務室', 2500 );
INSERT INTO TOM1 VALUES( 'E', '會計室', 4000 );
INSERT INTO TOM1 VALUES( 'F', '會計室', 2500 );
INSERT INTO TOM1 VALUES( 'I', '總務室', 2500 );
INSERT INTO TOM1 VALUES( 'H', '電腦室', 5000 );
INSERT INTO TOM1 VALUES( 'G', '總務室', 3000 );
COMMIT;
 
-- 範例 1: 按照薪水高低排序, 但這時候的 ROWNUM 卻不是 1, 2, 3, ... 一一顯示
SELECT ROWNUM
     , EMPLOYEE
     , DEPT_NO
     , SALARY
  FROM TOM1
 ORDER BY SALARY DESC;

 
-- 範例 2: 先利用 Subquery 將薪水按照高低排序, 再抓取 ROWNUM, 這時候 ROWNUM 是 1, 2, 3, ... 一一顯示
SELECT ROWNUM
     , A.*
  FROM (SELECT EMPLOYEE
             , DEPT_NO
             , SALARY
          FROM TOM1
         ORDER BY SALARY DESC
       ) A;

 
-- 範例 3: 不用 Subquery 而用分析函數, 將薪水按照高低排序, 且 ROW NUM 是 1, 2, 3, ... 一一顯示
SELECT ROW_NUMBER() OVER(ORDER BY SALARY DESC) ROW_NUM
     , EMPLOYEE
     , DEPT_NO
     , SALARY
  FROM TOM1;

 
-- 範例 4: ROW_NUMBER / RANK / DENSE_RANK 三者的差異
SELECT ROW_NUMBER() OVER(ORDER BY SALARY DESC) ROW_NUM
     , RANK()       OVER(ORDER BY SALARY DESC) RANK
     , DENSE_RANK() OVER(ORDER BY SALARY DESC) DENSE_RANK
     , EMPLOYEE
     , DEPT_NO
     , SALARY
  FROM TOM1;

 
-- 範例 5: ROW_NUMBER / RANK / DENSE_RANK 三者加上 PARTITION (用什麼來區別重新算) 的差異
SELECT ROW_NUMBER() OVER(PARTITION BY DEPT_NO ORDER BY SALARY DESC) ROW_NUM
     , RANK()       OVER(PARTITION BY DEPT_NO ORDER BY SALARY DESC) RANK
     , DENSE_RANK() OVER(PARTITION BY DEPT_NO ORDER BY SALARY DESC) DENSE_RANK
     , EMPLOYEE
     , DEPT_NO
     , SALARY
  FROM TOM1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值