oracle 中使用row_numer(),rank()及dense_rank()排序的區別

好久沒有寫了,那是因爲我沒碰到覺得可以分享的東西呢。

今天呢我們來看看oracle中使用row_numer(),rank()以及dense_rank()排序的區別。在最近的開發中遇到一個需要排名的列表。然後對我們上述的幾個排序函數進行了瞭解。

首先我們來準備一下數據。先建立個測試表。如下:

REATE TABLE "TEST_EMP" 
(
   "EMPNO"              NUMBER(4,0),
   "ENAME"              VARCHAR2(10),
   "JOB"                VARCHAR2(9),
   "MGR"                NUMBER(4,0),
   "HIREDATE"           DATE,
   "SAL"                NUMBER(7,2),
   "COMM"               NUMBER(7,2),
   "DEPTNO"             NUMBER(2,0)
);

COMMENT ON COLUMN "TEST_EMP"."EMPNO" IS
'員工ID';

COMMENT ON COLUMN "TEST_EMP"."ENAME" IS
'員工姓名';

COMMENT ON COLUMN "TEST_EMP"."JOB" IS
'職位';

COMMENT ON COLUMN "TEST_EMP"."MGR" IS
'員工管理者ID';

COMMENT ON COLUMN "TEST_EMP"."HIREDATE" IS
'入職日期';

COMMENT ON COLUMN "TEST_EMP"."SAL" IS
'薪資';

COMMENT ON COLUMN "TEST_EMP"."COMM" IS
'績效';

COMMENT ON COLUMN "TEST_EMP"."DEPTNO" IS
'部門ID';

插入一些數據。自己隨便加一些就好。如下:

圖1-1

第一個,row_numer(),這個排序函數的特點是相同數據,先查出的排名在前,沒有重複值。像我們這裏呢sal相同,先查出來的數據的rank排名優先。如下圖:1-2

第二個,rank()函數,是跳躍排序,相同數據(這裏爲sal列相同)排名相同,比如並列第1,則兩行數據(這裏爲rank列)都標爲1,下一位將是第3名.中間的2被直接跳過了。排名存在重複值。

1-3

第三個,dense_rank(),這個是連續排序的,比如兩條並列第1,則兩行數據(這裏爲rank列)都標爲1,下一個排名將是第2名。

1-4

這就是它們三之間的排序的一點區別。當然,分析函數over()也是值得我們好好去了解的。

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