MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
来源:互联网 发布:报纸版面编辑软件 编辑:程序博客网 时间:2024/05/01 00:36
在网上看到一个有趣的例子。http://www.mysqlops.com/2011/04/11/mysql-%e5%ae%9e%e7%8e%b0oracle-row_number-overpartition-by-%e5%88%86%e7%bb%84%e6%8e%92%e5%ba%8f%e5%8a%9f%e8%83%bd.html
由于MYSQL没有提供类似ORACLE中OVER()这样丰富的分析函数. 所以在MYSQL里需要实现这样的功能,我们只能用一些灵活的办法:
1.首先我们来创建实例数据:
drop table if exists heyf_t10;
create table heyf_t10 (empid int ,deptid int ,salary decimal(10,2) );
insert into heyf_t10 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);
2. 确定需求: 根据部门来分组,显示各员工在部门里按薪水排名名次.
显示结果预期如下:
+——-+——–+———-+——+
| 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 |
+——-+——–+———-+——+
3. SQL 实现
select empid,deptid,salary,rank from (
select heyf_tmp.empid,heyf_tmp.deptid,heyf_tmp.salary,@rownum:=@rownum+1 ,
if(@pdept=heyf_tmp.deptid,@rank:=@rank+1,@rank:=1) as rank,
@pdept:=heyf_tmp.deptid
from (
select empid,deptid,salary from heyf_t10 order by deptid asc ,salary desc
) heyf_tmp ,(select @rownum :=0 , @pdept := null ,@rank:=0) a ) result
;
4. 结果演示
mysql> select empid,deptid,salary,rank from (
-> select heyf_tmp.empid,heyf_tmp.deptid,heyf_tmp.salary,@rownum:=@rownum+1 ,
-> if(@pdept=heyf_tmp.deptid,@rank:=@rank+1,@rank:=1) as rank,
-> @pdept:=heyf_tmp.deptid
-> from (
-> select empid,deptid,salary from heyf_t10 order by deptid asc ,salary desc
-> ) heyf_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)
5.小结
此SQL正是利用了MYSQL的灵活以及用户变量的调用. 希望大家可以通过此例举一反三.写出更多更精彩的SQL.
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能.
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
- mysql 实现row_number() over(partition by ) 分组排序功能
- MySql ..IF.. 实现row_number() over(partition by ) 分组排序功能
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能优化
- mysql模拟Oracle(select t.*, row_number() over(partition by...)...实现分组排序功能
- mysql: 实现row_number() over (partition by) 分组排序
- MySQL实现ORALCE的row_number()over(partition by xx)功能
- mySql 实现排序函数row_number() over(partition by )
- MySQL实现Oracle的row_number()over(partition by)
- MySQL中实现Oracle里面 rank()over ( PARTITION BY ORDER BY) 分类分组功能
- row_number() over (partition by..order by...)分组排序
- Mysql 分组聚合实现 over partition by 功能
- Mysql 分组聚合实现 over partition by 功能
- Mysql 分组聚合实现 over partition by 功能
- Mysql实现ROW_NUMBER() over(PARTITION BY column1 order by column2)
- mysql实现ROW_NUMBER() over (PARTITION BY xx ORDER BY ** DESC)
- mysql 实现oracle里面row_number() OVER (PARTITION BY cid,author ORDER BY id DESC) 的方法
- QThread 使用探讨
- objective-C 中类似于C#中trim的方法(去掉字符串前后空格)
- String类中的堆区和栈区(转)
- abstract class和interface有什么区别(一)
- abstract class和interface有什么区别(二)
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
- eclipse 3.5.0汉化包下载与安装
- linux内核开机企鹅反了180度
- JS。某选择器。
- 用加窗法设计低通滤波器中遇到的问题
- 求图像质心的C语言实现
- Windows下利用C语言获得函数的执行时间
- linux2.6.12系统wpa_supplicant移植过程
- 反向进程注入及隐藏--动手做一个最简单的PELoader