Leetcode-Database-178-Rank Scores-Medium

Leetcode-Database-178-Rank Scores-Medium

题目地址:https://oj.leetcode.com/problems/rank-scores/

 

这个问题很有趣,写一个类似oracle里的窗口函数rank(),具体描述一下,有一张数据表Scores,里面有两个字段IdScore,具体结构如下:

+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

 

 

任务是要写一个sql来给Score字段打一个rank标识,条件是按照Score从大到小排序,相等情况时rank相同,且rank之间没有“洞”,即rank字段是连续值。显然这个任务比rank窗口函数容易一些,但是也是一个棘手的问题。

题目具体给出了输出示例:

+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
|
 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

 

 

平常说实话rank函数或者row_number函数用多了,很少考虑实现,面对这个问题,硬着头皮用笛卡尔积的join解决了,若是在hive中,strict模式可能拒绝笛卡尔积的join,这时还是求助于窗口函数rank~~

 

实现代码如下:

select
o1.Score
,count(o2.Score) as Rank
from(
select * from Scores
)o1
left outer join(
select distinct Score from Scores
)o2
on(o1.Score<=o2.Score)
group by
o1.Id
order by o1.Score desc

 



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。