文章目录

  • Oracle 的分组排序
  • MySQL 的分组排序
    • 分析需求
    • 创建模拟数据
    • SQL 实现
    • 结果演示

Oracle 的分组排序

Oracle 的分组排序函数的语法格式如下:

ROW_NUMBER() OVER([PARTITION BY column_1, column_2,…][ORDER BY column_3,column_4,…]
)

说明:表示根据 column_1, column_2,... 分组,在分组内部根据再根据 column_3,column_4,... 排序。

例如有下面这张员工表:

DROP TABLE IF EXISTS employee;create table employee(empid int,deptid int,salary decimal(10,2)
);insert into employee values(1,10,5500.00);
insert into employee values(2,10,4500.00);
insert into employee values(3,20,1900.00);
insert into employee values(4,20,4800.00);
insert into employee values(5,40,6500.00);
insert into employee values(6,40,14500.00);
insert into employee values(7,40,44500.00);
insert into employee values(8,50,6500.00);
insert into employee values(9,50,7500.00);

执行下面的分组排序语句:

SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank
FROMemployee;

得到的查询结果如下:

MySQL 的分组排序

由于 MySQL 没有提供类似 Oracle 中的类似 OVER() 这样丰富的分析函数,所以在 MySQL 里需要实现这样的功能,我们只能用一些灵活的办法。

分析需求

根据部门来分组,显示各员工在部门里按薪水排名名次。

显示结果预期如下:

+——-+——–+———-+——+
| empid | deptid | salary   | rank |
+——-+——–+———-+——+
|     1 |     10 |  5500.00 |    1 |
|     2 |     10 |  4500.00 |    2 |
|     4 |     20 |  4800.00 |    1 |
|     3 |     20 |  1900.00 |    2 |
|     7 |     40 | 44500.00 |    1 |
|     6 |     40 | 14500.00 |    2 |
|     5 |     40 |  6500.00 |    3 |
|     9 |     50 |  7500.00 |    1 |
|     8 |     50 |  6500.00 |    2 |
+——-+——–+———-+——+

创建模拟数据

drop table if exists employee;
create table employee (empid int ,deptid int ,salary decimal(10,2) );insert into employee values
(1,10,5500.00),
(2,10,4500.00),
(3,20,1900.00),
(4,20,4800.00),
(5,40,6500.00),
(6,40,14500.00),
(7,40,44500.00),
(8,50,6500.00),
(9,50,7500.00);

SQL 实现

SELECTempid,deptid,salary,rank, rownum
FROM(SELECTemployee_tmp.empid,employee_tmp.deptid,employee_tmp.salary,@rownum := @rownum + 1 as rownum,IF( @pdept = employee_tmp.deptid, @rank := @rank + 1, @rank := 1 ) AS rank,@pdept := employee_tmp.deptid FROM( SELECT empid, deptid, salary FROM employee ORDER BY deptid ASC, -- 按部门升序salary DESC -- 按工资降序) employee_tmp,( SELECT @rownum := 0, -- 声明定义用户变量rownum@pdept := NULL, -- 声明定义用户变量pdept@rank := 0 -- 声明定义用户变量rank) a ) result;

执行结果如下:

上述语句可以改成:

SET @ROW = 0; -- 声明定义用户变量row
SET @pdept = ''; -- 声明定义用户变量pdept
SET @rownum = 0; -- 声明定义用户变量rownumSELECTa.empid,a.deptid,a.salary,a.rank,a.rownum
FROM(SELECTempid,deptid,salary,@rownum := @rownum + 1 AS rownum,CASEWHEN @pdept = deptid THEN@ROW := @ROW + 1 ELSE @ROW := 1 END rank,@pdept := deptid
FROMemployee
ORDER BYdeptid,salary DESC ) a

结果演示

 MySQL > select empid,deptid,salary,rank from (-> select employee_tmp.empid,employee_tmp.deptid,employee_tmp.salary,@rownum:=@rownum+1 ,-> if(@pdept=employee_tmp.deptid,@rank:=@rank+1,@rank:=1) as rank,-> @pdept:=employee_tmp.deptid-> from (-> select empid,deptid,salary from employee order by deptid asc ,salary desc-> ) employee_tmp ,(select @rownum :=0 , @pdept := null ,@rank:=0) a ) result->  ;
+——-+——–+———-+——+
| empid | deptid | salary   | rank |
+——-+——–+———-+——+
|     1 |     10 |  5500.00 |    1 |
|     2 |     10 |  4500.00 |    2 |
|     4 |     20 |  4800.00 |    1 |
|     3 |     20 |  1900.00 |    2 |
|     7 |     40 | 44500.00 |    1 |
|     6 |     40 | 14500.00 |    2 |
|     5 |     40 |  6500.00 |    3 |
|     9 |     50 |  7500.00 |    1 |
|     8 |     50 |  6500.00 |    2 |
+——-+——–+———-+——+
9 rows in set (0.00 sec)

MySQL 如何实现 Oracle 的 row_number() over() 分组排序功能相关推荐

  1. 【SQL】Mysql5.7版本实现row_number分组排序功能

    Mysql5.7 版本实现row_number分组排序功能 # 建表 drop TABLE if EXISTS test; create table test(id varchar(50),ftime ...

  2. MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能

    MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能 由于MYSQL没有提供类似ORACLE中OVER()这样丰富的分析函数. 所以在MYSQ ...

  3. mysql 分组排序_MySQL如何实现Excel分组排序功能?

    Excel中分组排序只需要对数据进行升序降序,再利用if函数添加排序序号,即可筛选出分组top数据. Oracle也有row_number()函数对数据进行分组排序,而MySQL并没有此类函数,那么如 ...

  4. mysql给我的愚人节礼物——分组排序进行排名语句存在的问题

    今天我被mysql给愚了,写一个分数排名的业务sql语句,数据库使用的是mysql,数据库版本是8.0.18.在网上找到一个关于排名的语句写的比较复杂,经过调整之后满足了自己的业务需要.在使用过程中出 ...

  5. mysql 排序num_MySQL 实现row_number() 分组排序功能

    数据库基本脚本 CREATE TABLE `a` ( `ID` INT(10) NULL DEFAULT NULL, `class` INT(10) NULL DEFAULT NULL, `score ...

  6. ROW_NUMBER() OVER() 函数用法详解 (分组排序,多例子)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 语法格式:row_number() over(partition by 分组列 order by 排 ...

  7. row_number() over()排序功能说明

    1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...

  8. oracle分类函数总结,oracle中分组排序函数用法

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  9. oracle 条件排序函数,oracle中分组排序函数

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

最新文章

  1. RedHat8 配置本地yum源
  2. ASP.NET AJAX学习记要(2)-下手之DOM
  3. GTK+重拾--08 GTK+中的对话框
  4. 正则表达式grep, egrep, fgrep
  5. (九)数据结构之“图”
  6. 允许网站使用相机和麦克风_手机使用应用时总是需要获取权限,这3个权限不能随意给,望周知...
  7. java mvc 案例_springmvc经典案例
  8. 算法笔记--KMP算法 EXKMP算法
  9. swoft php怎么样,[原创]Swoole和Swoft的那些事 (Http/Rpc服务篇)
  10. activiti bpmn 安装不上_OTC弧焊工作站问题集-Win7 64位系统安装Step7 MicroWIN
  11. 炸了!我猜了7种颜色,就是没猜中苹果会出姨妈红!
  12. Android MediaCodec硬编码H264文件(四)
  13. 24.两两交换链表中的节点(力扣leetcode) 博主可答疑该问题
  14. cad安装日志文件发生错误_Autocad 2012 安装失败,某些产品无法安装。有日志文件,拜托求大神帮忙看看如何解决?...
  15. 国内期刊 CCT 模板编译经验
  16. 英飞凌基础学习笔记AURIX内核系统架构
  17. 国家对五险一金的交纳说明(已更新)
  18. 2009年的MACBOOK苹果电脑重装MAC OS 10.8.5系统
  19. [MSSQL]【SQL SERVER 2005+版本行转列示例】(2012年1-8月水源槑党25强榜单新鲜出炉)
  20. HDU Today-SPEA

热门文章

  1. java客户端api文档_Java 11:新的HTTP客户端API
  2. Oracle函数初探
  3. spring flux_Spring Web-Flux – Cassandra后端的功能样式
  4. drools6.5_Drools 6.4.0.Final提供
  5. 对象容器设计模式_容器对象模式。 一种新的测试模式。
  6. 访问nfs_通过NFS访问编年引擎
  7. spark restful_使用Spark构建简单的RESTful API
  8. ActiveMQ性能测试
  9. JDK 11:新的默认收集方法toArray(IntFunction)
  10. maven检测依赖_检测Maven依赖中介