SQL面试题:LIMIT和RANK窗口两种用法

面试问题

  • 找出全世界最赚钱的 3 家公司。 
  • 输出结果以及相应的公司名称。 
  • 根据利润降序对结果进行排序。

这个问题取自stratascratch
数据格式:
company:varchar
sector:varchar
industry:varchar
continent:varchar
country:varchar
marketvalue:float
sales:float
profits:float
assets:float
rank:int
forbeswebpage:varchar

解决方案1

  • 我们需要在数据集中找到全球 3 家盈利的公司,我们已经获得了利润和公司名称。
  • 因此,我们首先想到的就是按照公司的利润对公司进行排序。SQL 中的ORDER BY子句将完成这项工作。
  • 由于我们首先需要最赚钱的公司,因此我们可以添加DESC和ORDER BY子句。
  • 另外,我们需要前 3 家公司,我们可以通过添加 LIMIT 3 来获得。

SELECT 
 company, 
 profits 
FROM 
 forbes_global_2010_2014 
ORDER BY
 profits
DESC  
LIMIT 3;

解决方案2

  • 第一个解决方案非常简单。但我们也可以使用窗口函数来实现这个问题。
  • 这个想法是根据每家公司的利润对其进行排名,并返回排名为 3 或更低的公司。
  • 为了计算排名,我们可以使用RANK()函数,该函数需要一个窗口,我们可以使用OVER()定义该窗口,该窗口接受分区和排序依据,这里分区将是窗口函数中默认的整个数据集,对于顺序,我们可以通过ORDER BY利润DESC。
  • 下一个任务是从上述子查询中返回公司名称、利润和排名。为了返回 3 个最赚钱的公司,我们可以返回所有排名≤3 的公司。


SELECT
 company,
 profit,
 rank
FROM(
  SELECT 
   company,
   profits,
   rank() OVER(ORDER BY profits DESC) as rank
  FROM
   forbes_global_2010_2014
) x
WHERE x.rank<=3

总结

  • 在本文中,我们解决了一个中等 SQL 问题,其中使用了ORDER BY、LIMIT和RANK窗口函数等子句。
  • 我们讨论了 2 个解决方案并编写了代码。