hive 窗口分析函数 over:以 student表为例 求年龄top2

学生表student:
hive> select * from student;
OK
student.id      student.name    student.sex     student.age     student.dept
95002   刘晨    女      19      IS
95017   王风娟  女      18      IS
95018   王一    女      19      IS
95013   冯伟    男      21      CS
95014   王小丽  女      19      CS
95019   邢小丽  女      19      IS
95020   赵钱    男      21      IS
95003   王敏    女      22      MA
95004   张立    男      19      IS
95012   孙花    女      20      CS
95010   孔小涛  男      19      CS
95005   刘刚    男      18      MA
95006   孙庆    男      23      CS
95007   易思玲  女      19      MA
95008   李娜    女      18      CS
95021   周二    男      17      MA
95022   郑明    男      20      MA
95001   李勇    男      20      CS
95011   包小柏  男      18      MA
95009   梦圆圆  女      18      MA
95015   王君    男      18      MA
求:每个部门年龄最大的2个人的信息。
方法1:

先开窗,增加rank列。

hive> select id,name,sex,age,dept,row_number() over(partition by dept order by age desc) as rank  from student;
OK
id      name    sex     age     dept    rank
95006   孙庆    男      23      CS      1
95013   冯伟    男      21      CS      2
95001   李勇    男      20      CS      3
95012   孙花    女      20      CS      4
95014   王小丽  女      19      CS      5
95010   孔小涛  男      19      CS      6
95008   李娜    女      18      CS      7
95020   赵钱    男      21      IS      1
95002   刘晨    女      19      IS      2
95004   张立    男      19      IS      3
95019   邢小丽  女      19      IS      4
95018   王一    女      19      IS      5
95017   王风娟  女      18      IS      6
95003   王敏    女      22      MA      1
95022   郑明    男      20      MA      2
95007   易思玲  女      19      MA      3
95015   王君    男      18      MA      4
95011   包小柏  男      18      MA      5
95009   梦圆圆  女      18      MA      6
95005   刘刚    男      18      MA      7
95021   周二    男      17      MA      8

接下来可以先把数据存入另一个表,就比较容易求了。

create table student_kaichuang as
select id,name,sex,age,dept,row_number() over(partition by dept order by age desc) as rank  from student;

select * from student_kaichuang;
OK
student_kaichuang.id    student_kaichuang.name  student_kaichuang.sex   student_kaichuang.age   student_kaichuang.deptstudent_kaichuang.rank
95006   孙庆    男      23      CS      1
95013   冯伟    男      21      CS      2
95001   李勇    男      20      CS      3
95012   孙花    女      20      CS      4
95014   王小丽  女      19      CS      5
95010   孔小涛  男      19      CS      6
95008   李娜    女      18      CS      7
95020   赵钱    男      21      IS      1
95002   刘晨    女      19      IS      2
95004   张立    男      19      IS      3
95019   邢小丽  女      19      IS      4
95018   王一    女      19      IS      5
95017   王风娟  女      18      IS      6
95003   王敏    女      22      MA      1
95022   郑明    男      20      MA      2
95007   易思玲  女      19      MA      3
95015   王君    男      18      MA      4
95011   包小柏  男      18      MA      5
95009   梦圆圆  女      18      MA      6
95005   刘刚    男      18      MA      7
95021   周二    男      17      MA      8

接下来从student_kaichuang这个表里取数据:

hive> select id,name,sex,age,dept from student_kaichuang where rank<=2;
OK
id      name    sex     age     dept
95006   孙庆    男      23      CS
95013   冯伟    男      21      CS
95020   赵钱    男      21      IS
95002   刘晨    女      19      IS
95003   王敏    女      22      MA
95022   郑明    男      20      MA
方法2:

一步到位:

select id,name,sex,age,dept from 
(select id,name,sex,age,dept,
row_number() over(partition by dept order by age desc) as rank  
from student) d
where d.rank <= 2;
OK
id      name    sex     age     dept
95006   孙庆    男      23      CS
95013   冯伟    男      21      CS
95020   赵钱    男      21      IS
95002   刘晨    女      19      IS
95003   王敏    女      22      MA
95022   郑明    男      20      MA
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值