在MySQL中实现Rank高级排名函数

MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名。尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名效果。

在这里我用一个简单例子来实现排名的查询:

首先我们先创建一个我们需要进行高级排名查询的players表,

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、在MySQL中实现Rank普通排名函数

在这里,我们希望获得一个排名字段的列,以及age的升序排列。所以我们的查询语句将是:

SELECT pid, name, age, @curRank := @curRank + 1 AS rankFROM players p, (SELECT @curRank := 0) qORDER BY age

| PID | NAME | AGE | RANK |

|-----|---------|-----|------|

| 10 | Peter | 19 | 1 |

| 12 | Andre | 20 | 2 |

| 2 | Vino | 20 | 3 |

| 3 | John | 20 | 4 |

| 11 | Tom | 20 | 5 |

| 5 | Brian | 21 | 6 |

| 4 | Andy | 22 | 7 |

| 9 | George | 23 | 8 |

| 6 | Dew | 24 | 9 |

| 7 | Kris | 25 | 10 |

| 1 | Samual | 25 | 11 |

| 8 | William | 26 | 12 |

要在mysql中声明一个变量,你必须在变量名之前使用@符号。FROM子句中的(@curRank := 0)部分允许我们进行变量初始化,而不需要单独的SET命令。当然,也可以使用SET,但它会处理两个查询:

SET @curRank := 0;SELECT pid, name, age, @curRank := @curRank + 1 AS rankFROM playersORDER BY age

2、查询以降序排列

首要按age的降序排列,其次按name进行排列,只需修改查询语句加上ORDER BY和 DESC以及列名即可。

SELECT pid, name, age, @curRank := @curRank + 1 AS rankFROM players p, (SELECT @curRank := 0) qORDER BY age DESC, name

| PID | NAME | AGE | RANK |

|-----|---------|-----|------|

| 8 | William | 26 | 1 |

| 7 | Kris | 25 | 2 |

| 1 | Samual | 25 | 3 |

| 6 | Dew | 24 | 4 |

| 9 | George | 23 | 5 |

| 4 | Andy | 22 | 6 |

| 5 | Brian | 21 | 7 |

| 12 | Andre | 20 | 8 |

| 3 | John | 20 | 9 |

| 11 | Tom | 20 | 10 |

| 2 | Vino | 20 | 11 |

| 10 | Peter | 19 | 12 |

3、在MySQL中实现Rank普通并列排名函数

现在,如予果我们希望为并列数据的行赋相同的排名,则意味着那些在排名比较列中具有相同值的行应在MySQL中计算排名时保持相同的排名(例如在我们的例子中的age)。为此,我们使用了一个额外的变量。

SELECT pid, name, age,CASEWHEN @prevRank = age THEN @curRankWHEN @prevRank := age THEN @curRank := @curRank + 1END AS rankFROM players p,(SELECT @curRank :=0, @prevRank := NULL) rORDER BY age

| PID | NAME | AGE | RANK |

|-----|---------|-----|------|

| 10 | Peter | 19 | 1 |

| 12 | Andre | 20 | 2 |

| 2 | Vino | 20 | 2 |

| 3 | John | 20 | 2 |

| 11 | Tom | 20 | 2 |

| 5 | Brian | 21 | 3 |

| 4 | Andy | 22 | 4 |

| 9 | George | 23 | 5 |

| 6 | Dew | 24 | 6 |

| 7 | Kris | 25 | 7 |

| 1 | Samual | 25 | 7 |

| 8 | William | 26 | 8 |

如上所示,具有相同数据和排行的两行或多行,它们都会获得相同的排名。玩家Andre, Vino, John 和Tom都有相同的age,所以他们排名并列第二。下一个最高age的玩家(Brian)排名第3。这个查询相当于MSSQL和ORACLE中的DENSE_RANK()函数。

4、在MySQL中实现Rank高级并列排名函数

当使用RANK()函数时,如果两个或以上的行排名并列,则相同的行都会有相同的排名,但是实际排名中存在有关系的差距。

SELECT pid, name, age, rank FROM(SELECT pid, name, age,@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank,@incRank := @incRank + 1,@prevRank := ageFROM players p, (SELECT @curRank :=0, @prevRank := NULL, @incRank := 1) rORDER BY age) s

这是一个查询中的子查询。我们使用三个变量(@incRank,@prevRank,@curRank)来计算关系的情况下,在查询结果中我们已经补全了因为并列而导致的排名空位。我们已经封闭子查询到查询。这个查询相当于MSSQL和ORACLE中的RANK()函数。

| PID | NAME | AGE | RANK |

|-----|---------|-----|------|

| 10 | Peter | 19 | 1 |

| 12 | Andre | 20 | 2 |

| 2 | Vino | 20 | 2 |

| 3 | John | 20 | 2 |

| 11 | Tom | 20 | 2 |

| 5 | Brian | 21 | 6 |

| 4 | Andy | 22 | 7 |

| 9 | George | 23 | 8 |

| 6 | Dew | 24 | 9 |

| 7 | Kris | 25 | 10 |

| 1 | Samual | 25 | 10 |

| 8 | William | 26 | 12 |

在这里我们可以看到,Andre,Vino,John和Tom都有相同的age,所以他们排名并列第二。下一个最高年龄的球员(Brian)排名第6,而不是第3,因为有4个人并列排名在第2。

好的,我希望在这些例子后,能让你了解RANK()和DENSE_RANK()之间的区别,并且知道在哪里应使用哪个查询来获取MySQL中的rank函数。

rank()函数 mysql_在MySQL中实现Rank高级排名函数相关推荐

  1. mysql 排名_学会在MySQL中实现Rank高级排名函数,所有取前几名问题全部解决.

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...

  2. mysql over rank_sql - MySQL中的Rank函数

    sql - MySQL中的Rank函数 我需要找出客户的排名. 在这里,我为我的要求添加了相应的ANSI标准SQL查询. 请帮我转换为MySQL. SELECT RANK() OVER (PARTIT ...

  3. mysql rank_在MySQL中实现Rank高级排名函数

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...

  4. 在MySQL中实现Rank高级排名函数

    在MySQL中实现Rank高级排名函数 前言 用例表 1.在MySQL中实现普通排名 2.在MySQL中实现并列连续序号排名 3.在MySQL中实现并列非连续序号排名 4.随机获得一条数据 5.判断数 ...

  5. MySQL中实现rank排名查询

    MySQL中实现rank排名查询 1.基本知识: 2.升序排列,排名继续增加 3.降序排列,排名继续增加 4.升序排列,排名不跳级,继续+1,示例一 5.升序排列,排名不跳级,继续+1,示例二 6.升 ...

  6. mysql中locat函数,MySQL中的LOCATE和POSITION函数使用方法 | 很文博客

    不常用:MySQL中的LOCATE和POSITION函数 LOCATE(substr,str) POSITION(substr IN str) 返回子串 substr 在字符串 str 中第一次出现的 ...

  7. mysql的json函数与实例_Mysql实例详解Mysql中的JSON系列操作函数

    <Mysql实例详解Mysql中的JSON系列操作函数>要点: 本文介绍了Mysql实例详解Mysql中的JSON系列操作函数,希望对您有用.如果有疑问,可以联系我们. MYSQL必读前言 ...

  8. mysql中locat函数,MySQL中的LOCATE和POSITION函数使用方法

    不常用:MySQL中的LOCATE和POSITION函数 LOCATE(substr,str) POSITION(substr IN str) 返回子串 substr 在字符串 str 中第一次出现的 ...

  9. Mysql中当前日期(时间)函数总结

    Mysql中当前日期(时间)函数总结 select now():获取当前日期(包含时分秒) 2.Select date_formate(now(),"格式化") select da ...

最新文章

  1. [微信小程序]星级评分和展示(详细注释附效果图)
  2. 【已解决】github中git push origin master出错:error: failed to push some refs to(亲测)
  3. RabbitMQ惰性队列
  4. 北京黑龙江商会成立纪实(2)
  5. Punycode与中文互转
  6. MySQL -- 获取当前数据行号
  7. 吴恩达机器学习之单变量线性回归理论部分
  8. Firefox附加在合谋表演,谁跟踪你上网
  9. azure kinect三维点云_三维重建技术,你捋清楚了吗?本文适合小白
  10. BGP路由反射器原理及配置实例
  11. win10的自带ie浏览器打不开,点击无反应解决方法 网上提供的重置ie浏览器、卸载ie重装、安装多播协议都没管用
  12. 风车动漫服务器维修要多长时间,风车动漫APP是什么样的软件?风车动漫APP出现打不开的具体处理方法...
  13. 同一局域网下多台电脑共享文件夹
  14. 0-8 Vue进阶属性(directives、mixins、extends)
  15. 使用python构造大量测试数据_python实例编写(6)--引入unittest测试框架,构造测试集批量测试(以微信统一管理平台为例)...
  16. opencv贾老师系列17——人脸识别实战
  17. 多媒体的一些基本概念
  18. VIM快速文档整理技巧
  19. (4)FPGA开发工具介绍(第1天)
  20. 关键词如何布局和优化

热门文章

  1. 车辆工程计算机发展前景,2020车辆工程专业大学排名
  2. mysql根据身份证查询年龄
  3. 除水果外,其他食物摄入频率达标儿童仅有不到一半
  4. Oracle T-SQL语法
  5. Java 通过反射原理取得entity的值
  6. iOS Kingfisher 加载 gif 图
  7. 财报解读:Q2业绩指引未达预期,狂奔的爱彼迎要减速了?
  8. 两直线平行交叉相乘_交叉怎么写
  9. UML项目练习-仓库管理系统
  10. Anaconda3 下载安装详细步骤【图文详细教程】