MySQL8的新增特性--分组(取前几个)

需求:
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)
 
 

猜你喜欢

转载自blog.csdn.net/OYY_90/article/details/84953341
今日推荐