hive-OVER(PARTITION BY order by)函数 的使用

news/2025/5/26 2:12:54

准备测试数据

dss,1,95
fda,1,80
ffd,1,95
cfe,2,74
gds,2,92
3dd,3,78
adf,3,45
asdf,3,55
ddd,3,99
gf,3,99
use test;
create external table T2_TEMP
(name string,class string,sroce int)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE;load data local inpath '/tmp/data2.txt' overwrite into table T2_TEMP;

1、over函数的写法:

  over(partition by class order by sroce) 按照sroce排序进行累计,order by是个默认的开窗函数,按照class分区。

3、与over()函数结合的函数的介绍

(1)、查询每个班的第一名的成绩:rank()的使用(),如下 

SELECT * FROM (
select t.name,t.class,t.sroce,rank() over(partition by t.class order by t.sroce desc) mm from T2_TEMP t
) table_1 where mm = 1;得到的结果是:
dss        1        95        1
ffd        1        95        1
gds        2        92        1
gf         3        99        1
ddd        3        99        1
注意:在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果
SELECT * FROM (
select t.name,t.class,t.sroce,row_number() over(partition by t.class order by t.sroce desc) mm from T2_TEMP t
) table_1 where mm = 1;结果为:
dss      1        95        1  
gfs      2        92        1
ddd      3        99        1 

  可以看出,本来第一名是两个人的并列,row_number() 结果只显示了一个。

(2)、rank()和dense_rank()可以将所有的都查找出来,rank可以将并列第一名的都查找出来;rank()和dense_rank()区别:rank()是跳跃排序,有两个第二名时接下来就是第四名。

  rank()求班级成绩排名:

select t.name,t.class,t.sroce,rank() over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;查询结果:
dss        1        95        1
ffd        1        95        1
fda        1        80        3
gds        2        92        1
cfe        2        74        2
gf         3        99        1
ddd        3        99        1
3dd        3        78        3
asdf       3        55        4
adf        3        45        5

 

  dense_rank()l是连续排序,有两个第二名时仍然跟着第三名

select t.name,t.class,t.sroce,dense_rank() over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;查询结果:
dss        1        95        1
ffd        1        95        1
fda        1        80        2 
gds        2        92        1
cfe        2        74        2
gf         3        99        1
ddd        3        99        1
3dd        3        78        2
asdf       3        55        3
adf        3        45        4


3、sum()over()的使用

  根据班级进行分数求和

select t.name,t.class,t.sroce,sum(t.sroce) over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;dss        1        95        190  --由于两个95都是第一名,所以累加时是两个第一名的相加
ffd        1        95        190 
fda        1        80        270  --第一名加上第二名的
gds        2        92        92
cfe        2        74        166
gf         3        99        198
ddd        3        99        198
3dd        3        78        276
asdf       3        55        331
adf        3        45        376


4、first_value() over()和last_value() over()的使用 

select t.name,t.class,t.sroce,first_value(t.sroce) over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;select t.name,t.class,t.sroce,last_value(t.sroce) over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;

  分别求出第一个和最后一个成绩。

  
5、sum() over()的使用,求出班级的总分。

select t.name,t.class,t.sroce,sum(t.sroce) over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;
下面还有很多用法,就不一一列举了,简单介绍一下,和上面用法类似:

  count() over(partition by ... order by ...):求分组后的总数。
  max() over(partition by ... order by ...):求分组后的最大值。
  min() over(partition by ... order by ...):求分组后的最小值。
  avg() over(partition by ... order by ...):求分组后的平均值。
  lag() over(partition by ... order by ...):取出前n行数据。  

  lead() over(partition by ... order by ...):取出后n行数据。

  ratio_to_report() over(partition by ... order by ...):Ratio_to_report() 括号中就是分子,over() 括号中就是分母。

  percent_rank() over(partition by ... order by ...):

  
6、over partition by与group by的区别:

  group by是对检索结果的保留行进行单纯分组,一般和聚合函数一起使用例如max、min、sum、avg、count等一块用。partition by虽然也具有分组功能,但同时也具有其他的高级功能。

 

文章来源:https://blog.csdn.net/qq_41712271/article/details/109224538
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-17859.html

相关文章

Eclipse启动认定SDK地址,出现Error executing aapt

我把安卓的SDK安装在D盘,但是新建项目之后,提示的错误是 就是认定在F盘了,可是那个时候我只是在F盘启动了第一次,之后就拷贝到了D盘的,是不是第一次启动就会注册了什么的呢? 解决方案: 更改你的…

错误:expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token

GCC编译C源程序时出现:错误:expected ‘’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token,通常是因为在函数声明(包括包含的头文件中的函数声明)后面忘记了分号“;”。仔细检查一遍各个…

hive-分析函数 LAG、LEAD、FIRST_VALUE和LAST_VALUE OVER(PARTITION BY order by) 的使用

OVER(PARTITION BY order by)函数 的其它用法,可查看博文https://blog.csdn.net/qq_41712271/article/details/109224538创建表和数据 cookie1,2015-04-10 10:00:02,url2 cookie1,2015-04-10 10:00:00,url1 cookie1,2015-04-10 10:03:04,1url3 cookie1,2015-04-10 …

springboot不同版本上传(及大小限制)和下载文件(及中文乱码失败)问题

1.文件上传 用springboot做文件上传的时候就要考虑到具体上传时文件的大小了,因为springboot默认限制是单文件1M,总大小10M,当超过限制的时候就会抛异常了,因此我们要做好上传文件时大小的配置信息。 springboot做文件上传有两种…

设计模式----状态模式

定义: 当一个对象内在状态改变是允许改变其行为,这个对象看起来像是改变了其类。 状态模式的好处就是讲与特定状态相关的行为进行了局部化,并且将不同状态行为进行分割。也就是将特定的与改状态相关的行为都放进一个对象中,由于所…

图文解释JVM内存设置(内存管理优化),清晰明了

之前一篇文章讲解了关于tomcat的相关知识https://blog.csdn.net/bebmwnz/article/details/89968824,今天再来说说jvm内存及其优化的东西。本篇文章也是几百家所长结合自己的了解总结出来的,希望对大家有所帮助。在讲之前先来贴张图(丑是丑了点…

shell入门-常见变量 $0,$1,$2,$*,$#,$? 使用方法

$0 返回脚本的文件名称 $1-$9 返回对应的参数值 $* 返回所有的参数值是什么 $# 返回参数的个数和 $? 判断上一条命令执行的是否成功,成功返回0$0,$1,$2,$*,$# 代码示例 #!/bin/bash echo "…

基于OWIN+DotNetOpenOAuth实现OAuth2.0

这几天时间一直在研究怎么实现自己的OAuth2服务器,对于太了解OAuth原理以及想自己从零开始实现的,我建议可以参考《Apress.Pro ASP.NET Web API Security》里面的章节。最后发现其实微软在这方面也已经做了实现,所以文介绍下怎么基于OWIN来实…

maven项目(包括springboot等)引入本地jar时打jar或者war包发布,报找不到引入的jar包的问题解决方案

在maven项目中很多时候可能需要我们通过add reference方式引入的本地的jar包,而且自己在本地运行也是没有任何问题,但是在打包发布的时候就会报错找不到自己引入的文件,比如: 惊不惊喜?意不意外? 在这里&a…