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 替代方案

T-SQL 上的 RANK、ROW_NUMBER

如何在不使用排名功能的情况下更新表格中的分数

如何在不使用 SQL 中的 PIVOT 函数的情况下进行透视?

如何在不使用数据透视和反透视的情况下在 SQL Server 中水平显示数据?

如何在不使用 Group By / 有函数的情况下过滤 SQL 中的数据