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

文章目录

  • 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux mac地址文件夹,android4.4.2系统的mac地址文件在哪个文件里面

android 是Linux内核,linux中mac地址是保存在/etc/init.d/networ 文件中的但是在android中mac地址是直接写在硬件中的,需要通过API 才能获取1、Android 获取本机Mac 地址方法:需要在AndroidManifest.xml文件中添加权限:public String getLocalMacAddress…

Windows 如何用命令终端(CMD)启动和停止 MySQL 数据库服务

当安装完 MySql 后,默认每次 Windows 启动的时候都会将 MySql 服务启动起来。那么如何通过命令方式来启动和停止 MySQL 服务呢? Windows XP 如果是 Windows XP 则不需要使用管理员权限既可以很简单的启动和停止 MySQL 数据库服务,具体在命令…

java与java ee_Java EE MVC:处理表单验证

java与java ee在本文中,我们将介绍Java EE MVC中的表单验证。 Java EE MVC与Java Bean验证API( JSR 303 )集成在一起,这使得添加验证约束变得非常容易。 使用JAX-RS方式进行验证 假设我们有一个小的html表单,可用于发…

linux-macbook内核,技术|用 Linux 让旧 MacBook 重获新生

花上一小时,用 Fedora 让一台过时的 Mac 重新有用。最近,我偶然找到了一台 2011 年底的老款 13 英寸 MacBook Pro,有 125GB SSD 和 8GB 内存。我曾带着这台机器去世界各地旅行,当年,我开了很多场会议、研讨会或演示&am…

Windows 如何在命令终端(CMD)使用命令来访问本地/远程的 Oracle 数据库呢?

打开命令窗口后直接输入 sqlplus sys/123orcl as sysdba其中 sys 是用户名,123 是密码,orcl 是数据库实例名,as sysdba 表示用户 sys 是数据库管理员。 没有指定数据库实例名,那么访问默认的数据库实例,如果用户 sys…

linux消耗ram内存吗,linux - 释放Ubuntu 8.04服务器上的内存(RAM) - Ubuntu问答

问题描述我在带有某些轻量级服务器应用程序的Slicehost虚拟服务器上运行了Ubuntu 8.04-apache22,svnserve,mysql和proftpd。唯一严重的服务限制是RAM-我要支付256MB。我注意到,如果让系统运行几天/几周,则可用RAM的数量会缓慢下降…

java 读取集合到流中_Java 10:将流收集到不可修改的集合中

java 读取集合到流中Java 10引入了几种新方法来促进不可修改集合的创建。 List.copyOf &#xff0c; Set.copyOf和Map.copyOf方法从现有实例创建新的集合实例。 例如&#xff1a; List<String> modifiable Arrays.asList("foo", "bar"); List<…

Servlet 组件相关的接口、抽象类关系图

注&#xff1a; ServletConfig 依赖于 Servlet HttpServletResponse 继承自 ServletResponse HttpServlet 实现自 HttpServletResponse 和 HttpServletRequest

java6 已安装更高版本_Java 10及更高版本的思考

java6 已安装更高版本大家好 Java 10于2018年3月20日发布。我认为许多软件团队将阻止升级。 从Java 8到Java 9的专业人员人数可能还更少。为什么会这样&#xff0c;原因是传统的障碍以及对应用程序服务器&#xff0c;框架甚至是云原生容器的依赖。 例如&#xff0c;如果您在等待…

linux 命令api,linux命令行下字典,使用有道API

Linux命令行下的字典&#xff0c;使用“exit”退出。大家简单申请一个key就可以用了。这里申请#!/usr/bin/python3.2import urllib.requestimport jsondef wordMeaning(word):"""Use YouDao API key and the url below, get the JSON formatted information,the…

Java对象转换成JSON对象/JSON对象转换成JSON字符串/JSON字符串转换成JS对象

文章目录后端部分前端部分后端部分 Option op new Option("海淀","hd");//java对象转换json对象 JSONObject obj JSONObject.fromObject(op); //json对象转换成json字符串 String str obj.toString();List<Option> ops new ArrayList<Option…

kafka 消费端 api_在消费者的眼中:您真的需要为您的API提供客户端库吗?

kafka 消费端 apiRESTful Web服务和API的优点在于&#xff0c;任何使用HTTP协议的使用者都可以理解和使用它。 但是&#xff0c;同样的难题一遍又一遍地弹出&#xff1a;您是否应该将Web APis与客户端库一起使用&#xff1f; 如果是&#xff0c;您应该支持哪些语言或/和框架&am…

linux 进程的vss rss uss,内核/内存管理中的VSS/RSS/PSS/USS

转自&#xff1a;http://www.douban.com/note/161471809/RSS is the total memory actually held in RAM for a process.RSS can be misleading, because it reports the total all of the shared libraries that the process uses, eventhough a shared library is only loade…

如何将类加载到内存

// 将类Driver加载到内存&#xff0c;在内存会产生一个和类Driver对应的Class实例 Class class Class.forName("com.mysql.jdbc.Driver");// 获取类加载器&#xff0c;任何类都有个class属性&#xff0c;这个属性返回类在内存中对应的那个Class实例&#xff0c;通过…

idea资源包下创建资源包_根据谁创建资源授权资源

idea资源包下创建资源包我的一位同事向我提出了一个关于StackOverflow的有趣问题&#xff0c;并由于我在Spring方面的经验&#xff0c;建议我回答一个很好的问题。 问题是&#xff0c;“ 如何基于使用批注在REST中创建资源的用户来授权特定资源 。” 要点是&#xff1a; 我正…

如何卸载linux中的docker,linux centos7 安装、卸载docker

docker安装1&#xff1a;查看系统版本cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core)2:安装docker(yum方式)$ yum install docker3&#xff1a;查看是否安装成功$docker version若输出以下&#xff0c;说明安装成功Client:Version: 1.12.6API version: …

html页面中Location对象跳转页面用法

姓名&#xff1a;<input name"name"/></br> 薪水&#xff1a;<input name"salary"/></br> 年龄&#xff1a;<input name"age"/></br> <input type"submit" value"确认"/></br…

java orm框架有哪些_Java Stream ORM现在带有JOIN

java orm框架有哪些Speedment是一个Java Stream ORM工具包和运行时&#xff0c;它使您可以将数据库表作为标准Java Streams查看。 由于不必混合使用Java和SQL&#xff0c;因此该应用程序变得更加紧凑&#xff0c;从而使其开发速度更快&#xff0c;更不容易出错并且易于维护。 流…

linux pdb创建表空间,ORACLE12C PDB创建默认表空间和用户语句(示例代码)

第一次接触到12C CDB和PDB数据库&#xff0c;且客户提供的是ORACLE一体机&#xff0c;只有访问权&#xff0c;费劲周折&#xff0c;今记录12C创建默认路径表空间语句和用户--创建默认表空间&#xff1a;create tablespace tablesapce_name datafile size 500M autoextend on …

用户在页面输入的中文数据,servlet如何获得正确的中文值

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 告诉浏览器&#xff0c;返回的是html页面&#xff0c;而且是以utf-8编码的response.setContentType("text/html;charsetutf-8");//reques…