SQL:如何在不使用rank()的情况下理解解决方案代码



有人能向我解释为什么代码可以工作吗?问题是leetcode 178等级分数(https://leetcode.com/problems/rank-scores/)

SELECT
Score,
(SELECT count(distinct Score) FROM Scores WHERE Score >= s.Score) Rank
FROM Scores s
ORDER BY Score desc

我的问题是关于这一部分:(SELECT count(distinct Score) FROM Scores WHERE Score >= s.Score) as Rank

为什么它可以像1、2、3…一样进行排序,而不是像4 那样进行计数

最重要的一点是SQL有一个内置的函数来进行排名。这对于学习SQL比理解为什么这个特定的代码能工作更重要。

但是,如果要使用相关的子查询,那么限定查询中的所有列引用是非常重要的。因此,查询应该看起来像:

SELECT s.Score,
(SELECT count(distinct s2.Score)
FROM Scores s2
WHERE s2.Score >= s.Score
--------------^ correlation clause "connects" the subquery to the outer query
) as Rank
FROM Scores s
ORDER BY s.Score desc;

此代码用于计算大于或等于特定分数的值的数量。这就是correlation子句的工作原理。子查询计算大于或等于外部查询中每个分数的不同分数的数量。如果你不理解这一点,你需要了解更多关于相关子查询的信息;从数据库的文档开始。

请注意,用SQL的话说,这就是dense_rank()。使用该函数既简单又应该具有更好的性能。

Bellow-mysql代码将像mysql-中的dense_rank((一样工作

SELECT  IF(score <> @pscore,@i:=@i+1,@i:=@i) AS rank,
@pscore := score AS score
FROM scores p ,(SELECT @i := 0,@pscore := 0) r
ORDER BY score desc

相关内容

最新更新