Sql--排名思路解析及优化

编写一个 SQL 查询来实现分数排名。

如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

+----+-------+
| Id | Score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

+-------+------+
| Score | Rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
重要提示:对于 MySQL 解决方案,如果要转义用作列名的保留字,可以在关键字之前和之后使用撇号。例如 `Rank`

思路分析:

1、排名很好确定直接查询然后desc即可

2、添加Rank,举个例子:如果你考试得了90分 找出比你分数高或者分数相同的所有人的个数(100,99,98……一定要去重)有n个 那么你的排名就是n

select 
a.Score,
(select COUNT(DISTINCT b.Score)
FROM
Scores b where b.Score >= a.Score) `Rank`
from Scores a
ORDER BY a.Score DESC

优化:

使用上述 where太慢了需要每个都去对比,使用内连接

优化方案如下:

select a.Score as Score,count(distinct b.score) as Rank
from Scores as a
inner join Scores as b
on a.Score>=b.Score
group by a.id
order by Score desc;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一个简单的SQL解析器设计思路SQL解析器主要是将SQL语句解析成对应的语法树,下面是一个简单的实现流程。 1. 解析SQL语句 首先,我们需要将SQL语句解析成对应的语法树。解析时,可以使用正则表达式或者语法分析器进行分析,将SQL语句解析成对应的语法树。 2. 构建语法树 在得到语法树后,我们需要构建对应的语法树。语法树的节点可以表示SQL语句的各个部分,例如SELECT、FROM、WHERE、GROUPBY、ORDERBY等。 3. 进行语义分析 在得到语法树后,我们需要进行语义分析。语义分析主要是对SQL语句进行语义检查,以确保SQL语句的正确性。 例如,我们需要检查SELECT语句中的列是否存在,检查FROM语句中的表是否存在,检查WHERE语句中的条件是否合法等。 4. 生成执行计划 在完成语义分析后,我们需要生成对应的执行计划。执行计划主要是确定SQL语句的执行顺序和执行方式,以便进行优化和执行。 例如,我们可以使用优化技术,例如索引和缓存,来提高SQL语句的执行效率。 5. 执行SQL语句 最后,我们需要执行SQL语句,并返回查询结果。执行SQL语句时,我们可以根据执行计划,选择合适的执行方式,例如全表扫描、索引扫描等。 以上就是一个简单的SQL解析器的设计思路。当然,实际的实现可能还需要考虑更多的问题,例如SQL语句的复杂性、性能优化等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值