在MySql中实现类似row_number,dense_rank,rank函数的排序方法

MySQL中没有Rank排名函数,当需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名。要在mysql中声明一个变量,必须在变量名之前使用@符号。FROM子句中的(@curRank := 0)部分允许我们进行变量初始化,而不需要单独的SET命令。当然,也可以使用SET

CREATE TABLE `players` (
  `pid` int(2) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(2) NOT NULL,
  PRIMARY KEY (`pid`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

INSERT INTO `players` (`pid`, `name`, `age`) VALUES
(1, 'Samual', 25),
(2, 'Vino', 20),
(3, 'John', 20),
(4, 'Andy', 22),
(5, 'Brian', 21),
(6, 'Dew', 24),
(7, 'Kris', 25),
(8, 'William', 26),
(9, 'George', 23),
(10, 'Peter', 19),
(11, 'Tom', 20),
(12, 'Andre', 20);

1、实现Rank普通排名函数,即row_number():

SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players p, (
SELECT @curRank := 0
) q
ORDER BY age
SET @curRank := 0;
SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players
ORDER BY age
PIDNAMEAGERANK
10Peter191
12Andre202
2Vino203
3John204
11Tom205
5Brian216
4Andy227
9George238
6Dew249
7Kris2510
1Samual2511
8William2612

2、实现Rank普通并列排名函数,即dense_rank():

SELECT pid, name, age, 
	CASE 
        WHEN @prevRank = age THEN @curRank 
        WHEN @prevRank := age THEN @curRank := @curRank + 1
	END AS rank
FROM players p, 
(SELECT @curRank :=0, @prevRank := NULL) r
ORDER BY age
PIDNAMEAGERANK
10Peter191
12Andre202
2Vino202
3John202
11Tom202
5Brian213
4Andy224
9George235
6Dew246
7Kris257
1Samual257
8William268

3,实现Rank高级并列排名函数,即rank()函数:

SELECT pid, name, age, rank 
FROM
	(SELECT pid, name, age,
			@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank, 
			@incRank := @incRank + 1, 
			@prevRank := age
	 FROM players p, (
	 SELECT @curRank :=0, @prevRank := NULL, @incRank := 1
	   ) r 
ORDER BY age
  ) s
PIDNAMEAGERANK
10Peter191
12Andre202
2Vino202
3John202
11Tom202
5Brian216
4Andy227
9George238
6Dew249
7Kris2510
1Samual2510
8William2612

来源简书:https://www.jianshu.com/p/bb1b72a1623e

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值