关于leetcode第178道题的优雅过程

题目描述如图:

 最先想到的本来应该是使用mysql自带的窗口函数,肯定是很优雅的,但是我是初学者,对这个还不熟悉。

所以,一开始先做个分步计算,首先是降序查分数表,然后就是查分数前有多少个元素,根据排名要求确定去不去重和分数之间的比较条件,

降序查分数表:

select a.Score as Score

from Scores a

order by a.Score desc

查排名,作为子查询放在select后面

(select count(distinct b.Score) from Scores b where b.Score >= a.Score) as 'Rank'

检测结果:超过25?

看看别人怎么写的 :

自连接:确实从代码上看优雅了不少。

SELECT a.Score, COUNT(DISTINCT b.Score) AS `RANK`

FROM Scores a, Scores b

WHERE a.Score <= b.Score

GROUP BY a.Id

ORDER BY `RANK`;

但是本质是一样的,所以只击败了29%。

最后,直接调用mysql大佬们封装好的rank排名系列的窗口函数之dense_rank(),效果牛的!

select score, dense_rank() over (order by score desc) as 'rank'  #这个rank之所以要加引号,因为rank本身是个函数,直接写rank会报错

from scores;

 所以,我学到了什么,首先要关注相关新技术,新技术很明显是一些最佳实践,一件事你只要觉得麻烦但是问题有比较具体,那你就要相信大佬们在优雅这方面的追求。就比如这个排名问题,挺典型的sql问题,肯定有相关优化,直接找,效果杠杠的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子不顾及三毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值