[1177]Hive 窗口函数之lead() over(partition by ) 和 lag() over(partition by )

2023-10-10 08:27:14 浏览数 (2)

lag() over() 与 lead() over() 函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的前 N 行的数据 (lag) 和后 N 行的数据 (lead) 作为独立的列, 从而更方便地进行进行数据过滤。这种操作可以代替表的自联接,并且 LAG 和 LEAD 有更高的效率。

over() 表示 lag() 与 lead() 操作的数据都在 over() 的范围内,他里面可以使用 partition by 语句(用于分组) order by 语句(用于排序)。partition by a order by b 表示以 a 字段进行分组,再 以 b 字段进行排序,对数据进行查询。

例如:lead(field, num, defaultvalue) field 需要查找的字段,num 往后查找的 num 行的数据,defaultvalue 没有符合条件的默认值

语法如下:

代码语言:javascript复制
lead(expression,offset,default) over(partition by ... order by ...)

lag(expression,offset,default) over(partition by ... order by ... )

例如提取前一周和后一周的数据,如下:

代码语言:javascript复制
select year,week,sale,
lead(sale,1,NULL)
over(--前一周sale
partition by product,country,region
order by year,week
) lead_week_sale,
lag(sale,1,NULL)
over(--后一周sale
partition by product,country,region
order by year,week
) lag_week_sale
from sales_fact a
where a.country='country1' and a.product='product1' and region='region1'
order by product,country,year,week

相似的用法还有:

代码语言:javascript复制
    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 ...):

参考:https://blog.csdn.net/hongyd/article/details/83056194 https://zhuanlan.zhihu.com/p/183800056 https://blog.csdn.net/weixin_43792309/article/details/108910620

0 人点赞