hive的窗口函数精讲

Student表:

+---------------+----------------+--------------------------+----------------+
--+| student.name  | student.class  | student.cooperator_name  | student.score  |
+---------------+----------------+--------------------------+----------------+
--+ | df            | 3              | 测试公司1                    | 45          
   || asdf          | 3              | 测试公司2                    | 55          
   || cfe           | 2              | 测试公司2                    | 74          
   || 3dd           | 3              | 测试公司5                    | NULL        
   || fda           | 1              | 测试公司7                    | 80          
   || gds           | 2              | 测试公司9                    | 92          
   || ffd           | 1              | 测试公司10                   | 95          
   || dss           | 1              | 测试公司4                    | 95          
   || ddd           | 3              | 测试公司3                    | 99          
   || gf            | 3              | 测试公司9                    | 99          
   |+---------------+----------------+--------------------------+----------------+
--+

1.sum...over...

按照班级进行归类,统计总分数totalscore

select class,name,cooperator_name,score,sum(score) over(partition by class) as totalscore from student;

 

2.row_number()...over...

给每个班级进行排名(没有并列)

select name,class,score,row_number() over(partition by class order by score desc ) mm from student;

找出每个班级排名第一名的学生信息

在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果;

select * from (select name,class,score,row_number() over(partition by class order by score desc ) mm from student) s where s.mm = 1; 

Rank()和dense_Rank()可以将所有的都查找出来,如上面都可以将并列第一求出来。

Rand是跳跃排序,有两个第一名,下来就是第三名

select name,class,score,rank() over(partition by class order by score desc ) mm from student;

 

Densc_rank()

Densc_rank()连续排序和rank()的排序不一样,当有两个并列第一的时候,会有第二名

select name,class,score,dense_rank() over(partition by class order by score desc ) mm from student;

lag()...over()...函数用法(取出前n行数据)

LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值
第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值