首页 > 数据库技术 > 详细

Leetcode-Database-178-Rank Scores-Medium

时间:2015-01-29 02:01:44      阅读:327      评论:0      收藏:0      [点我收藏+]

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

 



Leetcode-Database-178-Rank Scores-Medium

原文:http://www.blogjava.net/changedi/archive/2015/01/28/422512.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!