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;

MySQL_rank()、row_number()、dense_rank()的区别_第1张图片

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;

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

总结

  1. row_number()是顺序排序,不跳过任何一个序号,就是行号
  2. dense_rank()是并列排序,不会跳过重复序号
  3. rank()是并列排序,会跳过重复序号

你可能感兴趣的:(MySQL)