IT编程 > 数据库 > Mysql

LeetCode——Rank Scores

95人参与2019-10-09

write a sql query to rank scores. if there is a tie between two scores, both should have the same ranking. note that after a tie, the next ranking number should be the next consecutive integer value. in other words, there should be no "holes" between ranks.

+----+-------+
| id | score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
for example, given the above scores table, your query should generate the following report (order by highest score):

+-------+------+
| score | rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

此题,其本质就是赋值行号(需要注意分数相同的情景).

在实践过程中,初版答案如下所示:

# write your mysql query statement below
select 
    a.score as score,
    (select count(distinct b.score) from scores b where b.score >= a.score) as rank
from scores a order by a.score desc;

此处,使用select count来统计行号,注意使用distinct来区分相同分数.
但是,此解题方案的效率较差,sql运行肯定是越快越好.
因此,在sql中引入变量来赋值行号,以替代耗时的select count操作.

# write your mysql query statement below
select 
    score,
    @row := @row + (@pre <> (@pre := score)) as rank
from scores, (select @row := 0, @pre := -1) t
order by score desc;

此处,查询是在scores与临时表之间进行cross join.
此外,使用临时变量(@row,@pre)记录行号.
tips:

通过以上改进,mysql的运行效率得到了较大的提高.

您希望与广大热心网友互动!!点此进行留言回复

相关推荐

LeetCode——Rank Scores

10-09

MySQL初学之select与函数的搭配使用

12-10

Windows下通过MySQL Installer安装MySQL服务的教程图解

02-14

window系统mysql无法输入和无法显示中文的处理配置

06-10

MySQL5.6基本优化配置

07-04

MySQL查询优化:用子查询代替非主键连接查询实例介绍

06-05

MySQL创建用户、为用户授权

08-20

Linux下MySQL或MariaDB忘记root密码的解决方法

12-12

MySQL基础入门使用和命令的使用

01-01

mysql根据经纬度求两地距离

11-21

最近更新

B树、B-树、B+树、B*树都是什么

05-12

mysql语句执行顺序是怎么样的,导致查询语句不同结果

05-12

MySQL——创建数据库与表

05-12

MySQL表的创建、修改、删除,表的字段类型有哪些

05-12

数据库mysql主从复制的原理和如何搭建主从复制

05-12

数据库mysql高可用配置架构部署实施

05-12

mysql数据库读写分离 Atlas架构

05-12

MySQL in CentOS 7 安装部署

05-12

Mysql用户管理相关

05-12

mysql 存储过程中双重循环嵌套的应用

05-12

网友评论