分数排名
题目
思路
- 本题有两种写法,一种直接调用rank()函数,这在新版本中是支持的,并且也是效率最高的做法
- 另一种做法是先选出排名,利用 score >= s.score 来进行题目所需操作
代码
- 直接调用rank()
select Score, dense_rank() over(order by Score desc) as 'Rank' from scores;
SELECT Score,
(SELECT count(DISTINCT score) FROM Scores WHERE score >= s.score)
AS 'Rank' FROM Scores s ORDER BY Score DESC ;
连续出现的数字
题目
思路
- 注意题目不是选出出现大于等于三次的数,而是连续出现大于等于三次的数,那么我们不妨列出三个相同的表r1, r2, r3
- 我们让表二和表一相差一位,表三和表二相差一位来进行对比,即
r2.Id = r1.Id + 1 and r2.Id = r3.Id - 1
并判断对应位置上的数字是否相等
r1.Num = r2.Num and r2.Num = r3.Num
从而选出对应的数字 - 再用distinct去重,最后得到结果
代码
# Write your MySQL query statement below
select distinct r2.Num as ConsecutiveNums from Logs r1, Logs r2, Logs r3
where r2.Id = r1.Id + 1 and r2.Id = r3.Id - 1 and r1.Num = r2.Num and r2.Num = r3.Num;
总结
- 题目1熟悉了rank()函数的用法,可以直接dense_rank() over 来进行排序
- 题目2实际上练习了表的连接,从而实现连续的判断
- 去重条件最后考虑,但是一定要考虑,不然很容易出错
以上,共勉