【数据库】HIVE SQL--排序

最近听小伙伴说了一个这样一个问题:学生表有两列姓名,分数,求张三在班级的排名。(注:学生姓名没有重复,分数可以重复,同分数的人排名一样)

样例数据:

studentscore
张三90
李四100
王五80
王小明80
李小鹏70

 

据说万能的知识库有一个这样的方法:

我试验了一下,未能成功。

方法如下:

select student,score,(select count(score)+1 as rank
                        from aa b
                       where  b.score > a.score
                     )AS rank
from aa a
order by score desc

若这样运行,会报错:

Error: org.apache.spark.sql.AnalysisException: Correlated column is not allowed in a non-equality predicate:

这里不可以是非等的判定条件,所以我就改了一下条件,变成等于,像如下这样:

select student,score,(select count(score)+1 as rank
                        from aa b
                       where  b.score = a.score
                     )AS rank
from aa a
order by score desc

结果为:

studentscorerank
李四1002
张三902
王五803
王小明803
李小鹏702

这样就达不到效果了。(不过也有可能是我hive sql不支持这种操作,SqlServer,mysql有可能可以哦~)

所以,我就想了一种更加简单的方法,在hive sql也可以使用:

select student,
       score,
       dense_rank()OVER(order by score desc) as rank
  from aa

结果:

studentscorerank
李四1001
张三902
王五803
王小明803
李小鹏704

所以,要取张三的成绩,可直接:

select student,
       score,
       dense_rank()OVER(order by score desc) as rank
  from aa
 where student = '张三'

以上是我尝试的一个方式,不过肯定还有别的方法,欢迎大家提出建议哦~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值