MySQL_rank()、row_number()、dense_rank()的区别

MySQL8.0后推出了窗口函数,本文将根据实际的案例区分一下rank()、row_number()、dense_rank()到底有啥不一样。

-- 成绩表
CREATE TABLE `Score`(
`s_id` VARCHAR(20),
`c_id` VARCHAR(20),
`s_score` INT(3),
PRIMARY KEY(`s_id`,`c_id`)
);

-- 成绩表测试数据
insert into Score values('01' , '01' , 80);
insert into Score values('01' , '02' , 90);
insert into Score values('01' , '03' , 99);
insert into Score values('02' , '01' , 70);
insert into Score values('02' , '02' , 60);
insert into Score values('02' , '03' , 80);
insert into Score values('03' , '01' , 80);
insert into Score values('03' , '02' , 80);
insert into Score values('03' , '03' , 80);
insert into Score values('04' , '01' , 50);
insert into Score values('04' , '02' , 30);
insert into Score values('04' , '03' , 20);
insert into Score values('05' , '01' , 76);
insert into Score values('05' , '02' , 87);
insert into Score values('06' , '01' , 31);
insert into Score values('06' , '03' , 34);
insert into Score values('07' , '02' , 89);
insert into Score values('07' , '03' , 98);

表结构

select * from score;

在这里插入图片描述

select *,
row_number() over(order by s_score desc) 'row_number',
rank() over(order by s_score desc) 'rank' ,
dense_rank() over(order by s_score desc) 'dense_rank'
from score;

在这里插入图片描述
可以看到,所有的函数得出来的数字都是顺序排序的,同样是降序排序row_number()的数值没有跳过任何一个值完全就是行号;rank()看第三行,前两行都是99分并列第1,第三名却是3,所以rank()会跳过重复值;dense_rank()同样看第三行,前两行并列第一,第三名却是2,所以dense_rank()不会跳过重复值。

总结

  1. row_number()是顺序排序,不跳过任何一个序号,就是行号
  2. dense_rank()是并列排序,不会跳过重复序号
  3. rank()是并列排序,会跳过重复序号
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值