題目地址:https://oj.leetcode.com/problems/rank-scores/
這個(gè)問(wèn)題很有趣,寫(xiě)一個(gè)類(lèi)似oracle里的窗口函數(shù)rank(),具體描述一下,有一張數(shù)據(jù)表Scores,里面有兩個(gè)字段Id和Score,具體結(jié)構(gòu)如下:
+----+-------+
| Id | Score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
任務(wù)是要寫(xiě)一個(gè)sql來(lái)給Score字段打一個(gè)rank標(biāo)識(shí),條件是按照Score從大到小排序,相等情況時(shí)rank相同,且rank之間沒(méi)有“洞”,即rank字段是連續(xù)值。顯然這個(gè)任務(wù)比rank窗口函數(shù)容易一些,但是也是一個(gè)棘手的問(wèn)題。
題目具體給出了輸出示例:
+-------+------+
| Score | Rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
平常說(shuō)實(shí)話rank函數(shù)或者row_number函數(shù)用多了,很少考慮實(shí)現(xiàn),面對(duì)這個(gè)問(wèn)題,硬著頭皮用笛卡爾積的join解決了,若是在hive中,strict模式可能拒絕笛卡爾積的join,這時(shí)還是求助于窗口函數(shù)rank吧~~
實(shí)現(xiàn)代碼如下:
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