SQL:如何在不使用 rank() 的情况下理解解决方案代码?
Posted
技术标签:
【中文标题】SQL:如何在不使用 rank() 的情况下理解解决方案代码?【英文标题】:SQL: how to understand the solution code without using rank()? 【发布时间】:2020-08-29 16:03:38 【问题描述】:有人可以向我解释为什么该代码可以工作吗?问题是leetcode 178 rank score(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 一样计数
【问题讨论】:
了解如何使用dense_rank()
。然后 。 . .当您对 SQL 非常熟悉时,请研究使用相关子查询实现它的替代方法(在现代数据库中您永远不会在实践中使用)。
【参考方案1】:
最重要的一点是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;
此代码正在计算大于或等于特定分数的值的数量。这就是相关性条款的工作原理。子查询正在计算大于或等于外部查询中每个分数的不同分数的数量。如果你不明白这一点,你需要更多地了解相关子查询;从您的数据库的文档开始。
请注意,在 SQL 用语中,这是dense_rank()
。并且使用该功能既简单又应该具有更好的性能。
【讨论】:
【参考方案2】:下面的 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
【讨论】:
谢谢。你能告诉我sql server中'@'和':='的术语是什么吗?我想研究一下如何理解和使用它以上是关于SQL:如何在不使用 rank() 的情况下理解解决方案代码?的主要内容,如果未能解决你的问题,请参考以下文章
简单集合枚举的 MS SQL row_number/rank 替代方案
如何在不使用 SQL 中的 PIVOT 函数的情况下进行透视?