hive函数之分析窗口函数

170 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

前面介绍过窗口函数,主要是和聚合类函数一起搭配使用的,最近又新学了一种分析窗口函数,不同的是这种函数可以对数据进行统计分析,下面来重点介绍一下这种窗口函数的使用吧。

分析函数

1、在一次查询中取出同一个字段的前N行数据: lag()

常见使用方法:lag(col,n,default)

具体功能描述:此函数也是结合窗口函数作为分析数据只用,经常应用在一些偏移值统计的计算当中。

其中col表示需要获取的列,n表示偏移数量,如果n是1,则在当前行往上取1行的数据作为本行的数据,如果往上1行没有数据,则显示默认值,即default表达式所写的值,如果获取的值为null,也是会默认用这个值代替。

这里的stack()函数的用法,会在后面的文章详细介绍到,这里的作用大家只要知道是为了创建一张临时表即可。

with mytable as (
select stack(  4 , 
'TOM'  ,  float  (  70  ),  '2021-01-13'  ,  
'TOM'  ,  float  (  80  ),  '2021-03-13'  ,  
'TOM'  ,  float  (  90  ),  '2021-05-13'  , 
'TOM'  ,  float  (  100  ),  '2021-07-13'  ) as (account_name,age,date)  
)  
​
select      
a.account_name      
,a.age      
,a.date      
,lag(a.date,  2  ,a.date) over (partition by a.account_name order by a.age desc) next_date
​
from mytable a
​

这里我用到的默认值就是date这个字段,所以当第一和第二条数据没有取到往前第 2 行的数据时,就用了默认值,也就是当前行的date字段,第三和第四行的数据就是沿用的往前两行的date字段的值。如下输出结果:

111.png

2、在一次查询中取出同一个字段的后N行数据: lead()

常见使用方法:lead(col,n,default)

具体功能描述:这个函数和上面的lag()函数功能类似,只有一个地方不同,那就是lag()是往前n行去获取数据,lead()则是往后n行去获取数据,其他功能基本全部相同,没有什么差别。直接上案例吧。

with mytable as (
select stack(  4  , 
'Mary'  ,  float  (  22  ),  '2021-01-13'  ,  
'Mary'  ,  float  (  33  ),  '2021-03-14'  ,  
'Mary'  ,  float  (  44  ),  '2021-05-15'  ,  
'Mary'  ,  float  (  55  ),  '2021-07-16'  ) as (account_name,age,date)  ) 
​
select      
a.account_name      
,a.age     
,a.date
,lead(a.date,  2  ,a.date) over (partition by a.account_name order by a.age desc) next_date
from mytable a

代码解析:根据account_name分区,按age从大到小排序,每次读取下两行的date字段数据,若无数据,则取当前行的默认值数据 。