LeetCode——Rank Scores
程序员文章站
2022-05-17 19:18:43
此题,其本质就是赋值行号(需要注意分数相同的情景). 在实践过程中,初版答案如下所示: 此处,使用 来统计行号,注意使用 来区分相同分数. 但是,此解题方案的效率较差, 运行肯定是越快越好. 因此,在 中引入变量来赋值行号,以替代耗时的 操作. 此处,查询是在 与临时表之间进行 . 此外,使用临时变 ......
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
:
- 通过
@pre
与当前score
的比较,确定是否+1,需要注意mysql
中的true/false
为0/1
); - 在
sql
中,set/update
语句中,=
表示赋值;在set/update/select
中,:=
表示赋值,因此使用:=
.
通过以上改进,mysql
的运行效率得到了较大的提高.
推荐阅读
-
python(leetcode)498. 对角线遍历
-
Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
-
Leetcode算法【114. 二叉树展开为链表】
-
php实现excel中rank函数功能的方法
-
LeetCode 50. Pow(x, n)
-
SQL Server 排序函数 ROW_NUMBER和RANK 用法总结
-
[leetcode]不同路径三连击~
-
LeetCode——Department Highest Salary(花式使用IN以及GROUP BY)
-
LeetCode——Department Top Three Salaries(巧妙使用子查询)
-
LeetCode——Customers Who Never Order(灵活使用NOT IN以及IN)