Hive的窗口函数

hive的窗口函数说的其实是over子句的用法而已,over可以实现逐条处理等效果,下面我列举一些实用的开窗函数

从第一条记录到当前行,逐行做sum
SUM(xx) OVER(PARTITION BY xx ORDER BY xx) AS xx

从起点到当前行,结果同上,只是加了范围控制 ROWS BETWEEN是控制子句的关键字,UNBOUNDED原意是无边际这里做起始行 ,PRECEDING指定前几行时所用的关键字 ,AND 范围连接-至 ,CURRENT ROW 当前行
SUM(xx) OVER(PARTITION BY xx ORDER BY xx ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS xx

逐行做sum操作,但是每行只计算前三行到当前行
SUM(xx) OVER(PARTITION BY xx ORDER BY xx ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS xx  

逐行做sum操作,但是每行只计算前三行到当前行的后一行,FOLLOWING指定后几行时所用的关键字
SUM(xx) OVER(PARTITION BY xx ORDER BY xx ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) AS xx

逐行做sum操作,但是每行只计算当前行以及之后的每一行,UNBOUNDED原意无边界这里做末尾行
SUM(xx) OVER(PARTITION BY xx ORDER BY xx ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS xx 

上面的是over子句的用法,看似少,但大家只要掌握了over子句的用法,那么开窗函数就简单了,而相对的over字句跟随着那个函数其实就不是那么重要了,比如上面的例子中over跟随着sum函数,但是其实完全可以是其他的函数avg也好,rank也好,都是同样的道理

但是在操作开窗函数的时候,任然有着一个应该引起注意的一点,就是对于over子句来说,其他的可以没有,不过partition by和order by是两个基石,虽然可以酌情灵活应用,但是最好能写上就写上,因为缺少这两个关键字之后的开窗函数可能会出问题,轻则可能达不到想要的效果,重则报错

下面介绍一些其他的常用开窗函数,这里注意,我前面说了开窗函数就是over子句的应用,理论上任何函数只要符合逻辑都可以作为开窗函数,所以导致开窗函数其实相当多,多到可能有些都不会用到,因此我下面只列举常用的,而其他比较偏门的就需要大家用的时候自己试试了

ROW_NUMBER() 分区内排序操作,从结果来说不会有同排序数据,因为凡是同排名的数据,该函数都会按照数据出现的先后继续排

RANK() 分区内排序,从结果上讲,会有同排名出现,但重复的排名会占用本该有的排名,导致排名会变成1 1 3 3 5 5 5 8....的样子

DENSE_RANK() 分区内排序,从结果上讲,也会有同排名出现,但重复的排名不会占用本该有的排名,结果会正常显示,如1 1 2 2 2 3 3 4 4 5 6.....

NTILE(n) 用户对查询结果从新分为n片,并返回片值

其他的还有很多但是不常用,大家有需要可以找找,我这里找到一个非常不错的博文,和大家分享一下https://blog.csdn.net/Abysscarry/article/details/81408265

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值