1. 程式人生 > >MySQL8.0視窗函式:rank()、dense_rank()、row_number()的區別

MySQL8.0視窗函式:rank()、dense_rank()、row_number()的區別

rank():跳躍排序; dense_rank():連續排序; row_number():沒有重複值的排序(記錄相等也是不重複的),可以進行分頁使用。

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

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';

插入一些資料。自己隨便加一些就好。如下:

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

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

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

其中需要注意的是:over(partition by class order by property) 按照property排序進行累計,order by是個預設的開窗函式,按照class分割槽。