MySQL中变量的用法——LeetCode 178. Rank Scores
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 |
+-------+------+ 该问题让我们对Score添加权重,相同的值有相同的权重,且权重是连续的数字。 如果是编程的话肯定很容易解决,不过放到SQL语句里就不见得很容易解决了。从思路来说,这个解法很简单,只要先对score排序,如果当前score的值比前一个score的值大,权重就自增1。如果不大于前一个score就保持原值 如果把后边的条件化简,我们的工作其实就是给score排序后加上序号。这时我们的操作就变得简单了。
select (@i:=@i+1) as i,table_name.* from table_name,(select @i:=0) as it
上述是从网上随便找到一个自动添加序号的语句。我们观察上面的SQL语句,并分析含有变量的SQL语句的结构。
首先把干扰项as去掉,as只是给查询结果取了一个别名,此处我们不必考虑as。
select score , (@i:=@i+1)from Scores,(select @i:=0) init order by score desc
这样的输出结果是:
{"headers": ["score", "(@i:=@i+1)"], "values": [[4.00, 1.0], [4.00, 2.0], [3.85, 3.0], [3.65, 4.0], [3.65, 5.0], [3.50, 6.0]]}
看看上面的结果,我们已经实现了一半的要求了。只不过现在结果中的序号没有满足“相同的值有相同的权重”这个要求。此时我们需要引入另一个变量@pre来保存上一个score。
当计算权重时如果@pre跟当前score相等,则@i保持原值(或者说+0),否则加1.
select
Score,
@i := @i + (@pre <> ( @pre := Score)) Rank
from
Scores,
(select @i := 0,@pre := -1) init
order by Score desc
这里需要注意的是变量@pre。由于我们在权重那里判断是根据@pre(前一个score的值)是否等于当前score的值,如果@pre的初始值为大于0的数,就可能判断出错。最好@pre的初始值设置为小于0的数。
MySQL中变量的用法——LeetCode 178. Rank Scores的更多相关文章
- [LeetCode#178]Rank Scores
Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ra ...
- sql -leetcode 178. Rank Scores
Score 很好得到: select Score from Scores order by Score desc; 要得到rank, 可以通过比较比当前Score 大的Score 的个数得到: sel ...
- mysql中变量赋值
http://www.cnblogs.com/qixuejia/archive/2010/12/21/1913203.html sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变 ...
- 转:MySQL中变量的定义和变量的赋值使用(转)
MySQL中变量的定义和变量的赋值使用(转) 说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较 ...
- mysql中FIND_IN_SET函数用法
本篇文章主要介绍mysql中FIND_IN_SET函数用法,用来精确查询字段中以逗号分隔的数据 以及其与 like 和 in 的区别 1.问题发现 之前在做工作任务时有这么一个需求:需要用接口所传的服 ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- mysql中limit的用法实例解析
mysql中limit的用法解析. 在mysql中,select * from table limit m,n.其中m是指记录开始的index,从0开始,n是指从第m条开始,取n条. 例如: mysq ...
- Mysql中limit的用法详解
Mysql中limit的用法详解 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,为我们提供了limit这样一个功能. SELECT * FROM table LIMIT [offset ...
- MySQL中变量的使用
一.认识MySQL 中的变量 在MySQL中变量的绝大部分的用处都是在存储过程和存储函数中. 当然也可以抛开存储过程和存储函数来单独使用. 变量在MySQL中的运用和在编程语言中的运用大体相同 二.M ...
随机推荐
- document.selection window.getSelection()
IE9以下支持:document.selection IE9.Firefox.Safari.Chrome和Opera支持:window.getSelection() 屏幕取词 function ge ...
- wordpress 忘记密码
update wp_users set user_pass=md5("123456") where user_login='帐号';
- mongodb批量插入数据
年前由于公司业务需要,后台需要获取流水记录,需要每天定时跑脚本,将流水记录跑入库里边,每天大概有个一百万左右,使用的数据库是mongodb,考虑到一条一条录入数据,100多万会跑断,就想着批量录入数据 ...
- C++标准库头文件<bits/stdc++.h>
在使用GNU GCC Compiler的时候,你可以包含一个头文件<bits/stdc++.h>,便可以使用C++中的各种标准库,而不用一个一个包含进来. 这在acm比赛中是一种常用的做法 ...
- 剑指Offer——把数组排成最小的数
题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 分析: 排 ...
- 剑指Offer——连续子数组的最大和
题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向 ...
- 原!linux脚本 expect命令 完成 输入密码交互 进行scp远程文件拷贝
1.安装expect yum install expect expect相关知识--- https://blog.csdn.net/lufeisan/article/details/53488395 ...
- squee_spoon and his Cube VI---郑大校赛(求最长子串)
市面上最常见的魔方,是三阶魔方,英文名为Rubik's Cube,以魔方的发明者鲁比克教授的名字命名.另外,二阶魔方叫Pocket Cube,它只有2*2*2个角块,通常也就比较小:四阶魔方叫Reve ...
- RocketMQ Java 客户端实现
本章介绍使用 Java 实现RocketMQ 的客户端. 以及各种消息的方式的实现. 本章实现了以下几种消息的实现方式: 一:普通消息 普通的消息分为三种: 1> 可靠的同步消息 可靠的同步传输 ...
- 技术分享会(二):SQLSERVER索引介绍
SQLSERVER索引介绍 一.SQLSERVER索引类型? 1.聚集索引: 2.非聚集索引: 3.包含索引: 4.列存储索引: 5.无索引(堆表): 二.如何创建索引? 索引示例: 建表 creat ...