Mysql和Oracle组内排序的区别

Mysql和Oracle组内排序的区别

一、Oracle组内排序Eg:

  1. 创建表:
drop table t_emp_wpzhang;
create table t_emp_wpzhang(
id int(11) primary key, 
name varchar(50),
age int(3),
dept varchar(20),
salary decimal(10 , 2)
);
  1. 准备数据
insert all 
    into t_emp_wpzhang(id,name,age,dept,salary) values (1, 'zzz', 18 , '销售部', 6000 )
    into t_emp_wpzhang(id,name,age,dept,salary) values (2, 'www', 19 , '销售部' , 7000)
    into t_emp_wpzhang(id,name,age,dept,salary) values (3, 'ppp', 20 , '研发部', 8000)
    into t_emp_wpzhang(id,name,age,dept,salary) values (4, 'zwp', 21 , '财务部', 9000)
    into t_emp_wpzhang(id,name,age,dept,salary) values (5, 'zhangwuping', 22 , '研发部', 10000)
    into t_emp_wpzhang(id,name,age,dept,salary) values (9, 'wpzhang', 23 , '财务部', 11000)
    into t_emp_wpzhang(id,name,age,dept,salary) values (10, 'kelsey', 24 , '研发部', 12000)
    into t_emp_wpzhang(id,name,age,dept,salary) values (11, 'wp', 25 , '研发部', 13000)
select 1 from dual; 
  1. 组内排序语法
select t.* ,
   ROW_NUMBER ()
       OVER (
                  PARTITION BY t.dept
                  ORDER BY t.age )
                  AS RN
from t_emp_wpzhang t 
  1. 结果
    在这里插入图片描述

  2. 另外:

select * from (
 select t.* ,
   ROW_NUMBER ()
       OVER (
                  PARTITION BY t.dept
                  ORDER BY t.age )
                  AS RN
     from t_emp_wpzhang t
)where rn = 1;

可以取出每组的第一个
【注】在使用over等开窗函数时,over里头的分组及排序的执行晚于“where,group by,order by”的执行。

二、Mysql中组内排序
1.创建表:

drop table t_emp_wpzhang;
create table t_emp_wpzhang(
id int(11) primary key auto_increment , 
name varchar(50),
age int(3),
dept varchar(20),
salary decimal(10 , 2)
);

2.准备数据

insert into t_emp_wpzhang(id,name,age,dept,salary) values 
(1, 'zzz', 18 , '销售部', 6000 ),
(2, 'www', 19 , '销售部' , 7000),
(3, 'ppp', 20 , '研发部', 8000),
(4, 'zwp', 21 , '财务部', 9000),
(5, 'zhangwuping', 22 , '研发部', 10000),
(9, 'wpzhang', 23 , '财务部', 11000),
(10, 'kelsey', 24 , '研发部', 12000),
(11, 'wp', 25 , '研发部', 13000);
  1. 组内排序
select @rownum:=@rownum+1 rownum,a.* ,
if(@dept=a.dept or (@dept is null and a.dept is null),
if(@age=a.age or (@age is null and a.age is null),@rank,@rank:=@rank+1),
           @rank:=1
) as row_number,
@dept:=a.dept,
@age:=a.age
from(SELECT * from t_emp_wpzhang order by dept,age asc)a,
 (select @rownum :=0,@dept:=null,@age:=null,@rank:=1)b

【说明】
1) 遍历表a 的第一行:变量@dept=null,@age=null => @rank=1 => @dept=‘研发部’ @age=‘20’
2) 遍历表的第二行:第一个if判断第二行的dept和@dept相等,则进行第二个if判断第二行的age和@age是否相等,相等row_number=@rank,不相等row_number=@rank+1;第一个if判断第二行的dept和@dept不相等,则row_num=1
3) 表第二行的dept值赋予给@dept 第二行的@age赋予给@age
依次遍历表的第三行,第四行…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值