MySQL8的新增特性--分組(取前幾個)
阿新 • • 發佈:2019-01-10
需求: emp表按照部門分組,取每部門薪資最高的前3名或者取各個部門的第N名資料。 0.環境資訊: mysql> show variables like 'version%'; +-------------------------+------------------------------+ | Variable_name | Value | +-------------------------+------------------------------+ | version | 8.0.12 | | version_comment | MySQL Community Server - GPL | | version_compile_machine | x86_64 | | version_compile_os | linux-glibc2.12 | | version_compile_zlib | 1.2.11 | +-------------------------+------------------------------+ 5 rows in set (0.00 sec) mysql> system cat /etc/centos-release CentOS Linux release 7.5.1804 (Core) mysql> 1.資料和表的準備: CREATE TABLE emp ( empno int unsigned NOT NULL primary key , ename varchar(10) not null default '' , job varchar(9) not null default '' , mgr int unsigned, hiredate date, sal decimal(7,2) , comm decimal(7,2), deptno tinyint unsigned ); INSERT INTO emp VALUES (7369,'SMITH','CLERK',7902, STR_TO_DATE('17-DEC-80','%d-%b-%y'),800,NULL,20); INSERT INTO emp VALUES (7499,'ALLEN','SALESMAN',7698, STR_TO_DATE('20-FEB-81','%d-%b-%y'),1600,300,30); INSERT INTO emp VALUES (7521,'WARD','SALESMAN',7698, STR_TO_DATE('22-FEB-81','%d-%b-%y'),1250,500,30); INSERT INTO emp VALUES (7566,'JONES','MANAGER',7839, STR_TO_DATE('02-APR-81','%d-%b-%y'),2975,NULL,20); INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,STR_TO_DATE('28-SEP-81','%d-%b-%y'),1250,1400,30); INSERT INTO emp VALUES (7698,'BLAKE','MANAGER',7839, STR_TO_DATE('01-MAY-81','%d-%b-%y'),2850,NULL,30); INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839, STR_TO_DATE('09-JUN-81','%d-%b-%y'),2450,NULL,10); INSERT INTO emp VALUES (7788,'SCOTT','ANALYST',7566, STR_TO_DATE('19-APR-87','%d-%b-%y'),3000,NULL,20); INSERT INTO emp VALUES (7839,'KING','PRESIDENT',NULL, STR_TO_DATE('17-NOV-81','%d-%b-%y'),5000,NULL,10); INSERT INTO emp VALUES (7844,'TURNER','SALESMAN',7698,STR_TO_DATE('08-SEP-81','%d-%b-%y'),1500,0,30); INSERT INTO emp VALUES (7876,'ADAMS','CLERK',7788, STR_TO_DATE('23-MAY-87','%d-%b-%y'),1100,NULL,20); INSERT INTO emp VALUES (7900,'JAMES','CLERK',7698, STR_TO_DATE('03-DEC-81','%d-%b-%y'),950,NULL,30); INSERT INTO emp VALUES (7902,'FORD','ANALYST',7566, STR_TO_DATE('03-DEC-81','%d-%b-%y'),3000,NULL,20); INSERT INTO emp VALUES (7934,'MILLER','CLERK',7782, STR_TO_DATE('23-JAN-82','%d-%b-%y'),1300,NULL,10); --查詢語句: mysql> with t as (SELECT DEPTNO, SAL, ROW_NUMBER () OVER ( PARTITION BY DEPTNO ORDER BY SAL DESC ) AS RN FROM EMP) select * from t where t.rn<4; +--------+---------+----+ | DEPTNO | SAL | RN | +--------+---------+----+ | 10 | 5000.00 | 1 | | 10 | 2450.00 | 2 | | 10 | 1300.00 | 3 | | 20 | 3000.00 | 1 | | 20 | 3000.00 | 2 | | 20 | 2975.00 | 3 | | 30 | 2850.00 | 1 | | 30 | 1600.00 | 2 | | 30 | 1500.00 | 3 | +--------+---------+----+ 9 rows in set (0.00 sec)