MySQL中rank()、row_number()、dense_rank()排序
MySQL中的序号函数
环境:MySQL 8.0
脚本准备:
CREATE TABLE `player_score` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) COMMENT '姓名',
`score` int NOT NULL DEFAULT '0' COMMENT '得分',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB;
INSERT INTO `player_score` (`name`, `score`, `created_at`) VALUES ('詹姆斯', 40, NOW());
INSERT INTO `player_score` (`name`, `score`, `created_at`) VALUES ('格林', 10, NOW());
INSERT INTO `player_score` (`name`, `score`, `created_at`) VALUES ('库里', 35, NOW());
INSERT INTO `player_score` (`name`, `score`, `created_at`) VALUES ('克莱', 25, NOW());
INSERT INTO `player_score` (`name`, `score`, `created_at`) VALUES ('戴维斯', 40, NOW());
INSERT INTO `player_score` (`name`, `score`, `created_at`) VALUES ('杜兰特', 35, NOW());
sql执行:
select id, name, score,
RANK() over(order by score desc) as rank_,
DENSE_RANK() over(order by score desc) as dense_rank_,
ROW_NUMBER() over(order by score desc) as row_number_
from player_score
结论:
row_number() 顺序排序:对数据中的序号进行顺序显示,不管其排序结果是否出现重复值,排序结果为1,2,3,4,5…
rank() 并列排序:相同字段数值并列排序,且跳过重复序号,如, 1,1,3,4,5 。rank函数没有参数,但需要指定按照那个字段进行排名,所以使用rank函数必须用order by参数,order by的排序字段就是排名字段
dense_rank() 并列排序:相同字段数值并列排序,且不跳过重复序号,如:1,1,2,3,4