ITPub博客

首页 > 数据库 > 数据库开发技术 > 图解面试题:经典排名问题

图解面试题:经典排名问题

原创 数据库开发技术 作者:猴子数据分析 时间:2019-12-12 21:00:00 0 删除 编辑


【题目】

下图是"班级"表中的内容,记录了每个学生所在班级,和对应的成绩。


现在需要按成绩来排名,如果两个分数相同,那么排名要是并列的。


正常排名是1,2,3,4,但是现在前3名是并列的名次,排名结果是:1,1,1,2。


【解题思路】

1.涉及到排名问题,可以使用窗口函数


2.专用窗口函数rank, dense_rank, row_number有什么区别呢?


它们的区别我举个例子,你们一下就能看懂:


select *,   rank() over (order by 成绩 desc) as ranking,   dense_rank() over (order by 成绩 desc) as dese_rank,   row_number() over (order by 成绩 desc) as row_numfrom 班级;


得到结果:

从上面的结果可以看出:

rank函数:这个例子中是5位,5位,5位,8位,也就是如果有并列名次的行,会占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,4。


dense_rank函数:这个例子中是5位,5位,5位,6位,也就是如果有并列名次的行,不占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,2。


row_number函数:这个例子中是5位,6位,7位,8位,也就是不考虑并列名次的情况。比如前3名是并列的名次,排名是正常的1,2,3,4。


这三个函数的区别如下:


根据题目要求的排名规则,这里我们使用dense_rank函数。所以,最终的sql语句是:


select *,   dense_rank() over (order by 成绩 desc) as dese_rankfrom 班级;



【本题考点】

1.考察如何使用窗口函数
2.专用窗口函数排名的区别:rank, dense_rank, row_number


【举一反三】

涉及到排名的问题,都可以使用窗口函数来解决。记住rank, dense_rank, row_number排名的区别。


例子,编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。




例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):



参考答案:


select score,        dense_rank() over(order by Score desc) as rankingfrom Scores;


推荐:如何提升你的分析技能,实现升职加薪?


原文作者:猴子数据分析;如有侵权,请联系管理员删除。

上一篇: 你有议价权吗?
请登录后发表评论 登录
全部评论

注册时间:2017-01-16

  • 博文量
    865
  • 访问量
    345463