MySQL8.0視窗函式:rank()、dense_rank()、row_number()的區別
阿新 • • 發佈:2018-12-11
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分割槽。