热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hive开窗函数使用,用案例演示

hive的开窗函数的使用hive开窗函数,大致就是row_number()、sum()、coun()、avg()、max()、min()、first_value()

hive的开窗函数的使用

hive开窗函数,大致就是row_number()、sum()、coun()、avg()、max()、min()、first_value()、last_value()、lag()、lead()、cume_dist()、rank()、dense_rank()、ntile()这些接over开窗口,over()中指定partition by,表示分组,order by表示排序;开窗方式可以是对分组内,或者分组后并排序之后获取当前行到有界或者无界的行数据的聚合,或者是对于分组后(是否排序看是否指定排序条件order by)组内比当前条件匹配的结果和当前组内所有数据之间的计算,或者相对于当前行存在前后行数差值为指定值的数据的计算。
通过hive SQL对下列数据加工得到目标数据。
有student表,字段有:name学生姓名、province学生归属地、age年龄,数据如下:
张三 四川 23
赵六 四川 38
关羽 北京 40
张飞 北京 37
李四 江苏 22
秦九 四川 28
周瑜 江苏 29
王五 江苏 25
周三 四川 38
曹操 江苏 45
吕布 北京 32


  1. 用hive SQL查询,如何得到如下结果?(省份排序顺序按照首字母c-h-j-s)
    周三 四川 38 1
    赵六 四川 38 2
    秦九 四川 28 3
    张三 四川 23 4
    曹操 江苏 45 1
    周瑜 江苏 29 2
    王五 江苏 25 3
    李四 江苏 22 4
    关羽 北京 40 1
    张飞 北京 37 2
    吕布 北京 32 3

  • 用row_number获取按照省份分组并按照年龄排序,开窗得到行号:

select name,province,age,
--开窗获取分组内的行号
row_number() over(partition by province order by age desc) as rownum
from student;

  1. 如何用hive SQL查询得到如下结果?
    周三 四川 38 1
    赵六 四川 38 1
    秦九 四川 28 3
    张三 四川 23 4
    曹操 江苏 45 1
    周瑜 江苏 29 2
    王五 江苏 25 3
    李四 江苏 22 4
    关羽 北京 40 1
    张飞 北京 37 2
    吕布 北京 32 3

    组内排名(跳跃),是要通过dense_rank实现:

select name,province,age,
--dense_rank:跳跃排名(113)
dense_rank() over(partition by province order by age desc) as dense_rank
from student;

  1. 如何用hive SQL查询得到如下结果?
    周三 四川 38 1
    赵六 四川 38 1
    秦九 四川 28 2
    张三 四川 23 3
    曹操 江苏 45 1
    周瑜 江苏 29 2
    王五 江苏 25 3
    李四 江苏 22 4
    关羽 北京 40 1
    张飞 北京 37 2
    吕布 北京 32 3

    组内排名,是要通过rank实现:

select name,province,age,
--rank:排名(112)
rank() over(partition by province order by age desc) as rank
from student;

  1. 如何用hive SQL查询得到如下结果?
    周三 四川 38 31.75
    赵六 四川 38 31.75
    秦九 四川 28 31.75
    张三 四川 23 31.75
    曹操 江苏 45 30.25
    周瑜 江苏 29 30.25
    王五 江苏 25 30.25
    李四 江苏 22 30.25
    关羽 北京 40 36.33
    张飞 北京 37 36.33
    吕布 北京 32 36.33

    通过分组后,求组内平均数,用函数avg聚合:

select name,province,age,
--求根据每个学生的科目在自己省份的平均数,四舍五入保留两位小数
round(avg(age) over(partition by province order by age desc),2) as avg_age
from student;

  1. 如何用hive SQL查询得到如下结果?
    周三 四川 38 127
    赵六 四川 38 127
    秦九 四川 28 127
    张三 四川 23 127
    曹操 江苏 45 121
    周瑜 江苏 29 121
    王五 江苏 25 121
    李四 江苏 22 121
    关羽 北京 40 109
    张飞 北京 37 109
    吕布 北京 32 109

    通过sum聚合:

select name,province,age,
sum(age) over(partition by province order by age desc) as sum_age
from student;

  1. 如何用hive SQL查询得到如下结果?
    周三 四川 38 38
    赵六 四川 38 38
    秦九 四川 28 38
    张三 四川 23 38
    曹操 江苏 45 45
    周瑜 江苏 29 45
    王五 江苏 25 45
    李四 江苏 22 45
    关羽 北京 40 40
    张飞 北京 37 40
    吕布 北京 32 40

    用first_value获取组内最大值:

select name,province,age,
first_value(age) over(partition by province order by age desc) as first_value
from student;

  1. 如何用hive SQL查询得到如下结果?
    周三 四川 38 1
    赵六 四川 38 1
    秦九 四川 28 2
    张三 四川 23 2
    曹操 江苏 45 1
    周瑜 江苏 29 1
    王五 江苏 25 2
    李四 江苏 22 2
    关羽 北京 40 1
    张飞 北京 37 1
    吕布 北京 32 2

    用369等分分级函数开窗获取级别字段:

select name,province,age,
--如果不够分,遵循排在前面级别的数据多于后面的原则划分级别
ntile(age) over(partition by province order by age desc) as level_age
from student;

  1. 如何用hive SQL查询得到如下结果?
    曹操 江苏 45 0.0909090909
    关羽 北京 40 0.1818181818
    赵六 四川 38 0.3636363636
    周三 四川 38 0.3636363636
    张飞 北京 37 0.4545454545
    吕布 北京 32 0.5454545455
    周瑜 江苏 29 0.6363636364
    秦九 四川 28 0.7272727273
    王五 江苏 25 0.8181818182
    张三 四川 23 0.9090909091
    李四 江苏 22 1.0000000000

    用cume_dist求排序后(组内)值大于等于当前值的行数占整个(有分组字段就分组内,没有则全表)组内的比例:

select name,province,age,
--大于等于当前age值的数据所占比例
round(cume_dist(age) over(order by age desc)) as order_rate
from student;

推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
author-avatar
牵绊2502897683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有