SQL进阶01:rank排名函数

前言

mysql免费开源,相信做数据的同学基本都会接触到此数据库。那给一些数据进行排名,是我们在数据处理过程中很常见的事情,但是mysql没有直接的rank排名函数,如何解决这个问题呢。那今天就给大家讲解下如何在mysql里如何实现在排名 :

案例示范:

1. 建表并插入数据:
 CREATE TABLE `cats` (
      `cid` int(50) NOT NULL AUTO_INCREMENT,
      `name` varchar(50) NOT NULL,
      `length` int(10) NOT NULL,
      PRIMARY KEY (`cid`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

INSERT INTO `cats` (`cid`, `name`, `length`) VALUES
(1, 'A', 18),
(2, 'B', 17),
(3, 'C', 23),
(4, 'D', 21),
(5, 'E', 20),
(6, 'F', 27),
(7, 'G', 15),
(8, 'H', 19),
(9, 'I', 26),
(10, 'J', 19),
(11, 'K', 20),
(12, 'L', 22),
(13, 'M', 17),
(14, 'N', 18),
(15, 'O', 23);
image.png
2.实现rank一般排名

实现增加排名字段的列、并按照legth升序,初始化定义变量@curRank := 0:

        SELECT cid, name, length, @curRank := @curRank + 1 AS rank
        FROM cats p, (
        SELECT @curRank := 0
        ) q
        ORDER BY length

或者使用set声明变量:

SET @curRank := 0;
SELECT cid, name, length, @curRank := @curRank + 1 AS rank
FROM cats
ORDER BY length
image.png
3、实现以多字段排名

先以length降序、再以name排列,与上面类似,加一个字段排序就好了。

    SELECT cid, name, length, @curRank := @curRank + 1 AS rank
    FROM cats p, (
    SELECT @curRank := 0
    ) q
    ORDER BY length DESC, name
image.png
4、实现并列排名(第一种情况)

相同length值排名一样;且下一个大的length值的排名加1,如下:

SELECT cid, name, length, 
CASE 
WHEN @prevRank = length THEN @curRank 
WHEN @prevRank := length THEN @curRank := @curRank + 1
END AS rank
FROM cats p, 
(SELECT @curRank :=0, @prevRank := NULL) r
ORDER BY length
image.png
5、实现并列排名(第二种情况)

相同length值排名一样;且下一个大的length值的排名按照所处的行数,进行排序,也就是它在多少行,排名就是多少,如下:

 SELECT cid, name, length, rank FROM
(SELECT cid, name, length,
@curRank := IF(@prevRank = length, @curRank, @incRank) AS rank, 
@incRank := @incRank + 1, 
@prevRank := length
FROM cats p, (
SELECT @curRank :=0, @prevRank := NULL, @incRank := 1
) r 
ORDER BY length) s
image.png

好了,是不是很好的解决了我们的排名问题了呢,赶快试试吧~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容